activity切换,生命周期的问题
常见的生命周期这里就不再赘述了。这里主要说下自己之前认识不到位的几个点
-
两个activity切换,生命周期之间的影响:
onPause() : 表示activity正在停止,正常情况下,接着会执行activity的onStop()。
这个生命周期中,可以做一些存储数据和停止动画的操作,但是一定不要执行耗时的操作。因为如果执行耗时的操作,会影响下一个activity的显示。 onPause()必须执行完,新的activity的onResume()才会执行 可以这么理解:同一时间点,只可能又一个activity获取焦点,新的activity获取焦点(执行onResuem())前,必须收回将上一个activity的焦点(执行onPause())。 -
异常情况下的activity的生命周期的分析
2.1 异常情况的类型:
- 系统配置发生变化(最典型的:横竖屏切换)
- 系统内存不足,低优先级的activity被系统杀掉
2.2 异常情况下做了哪些事
首先,activity会被销毁,会走相应的生命周期。同时,系统会保护数据,执行onSaveInstanceState()(onStop() 之前调用) 。activity被重新创建时,通过onRestoreInstanceState()(onStart() 之后) 恢复之前保存的数据。
2.3 异常情况下,系统自动做的恢复操作
这里用到了委托的思想。 首先,activity被异常终止,activity会调用onSaveInstanceState去保护数据,然后activity会委托windows 去保存数据, windows去委托它上面的顶层布局容器去保存数据,最后顶层容器再通知其各个子控件去保存数据。
2.4 配置configChanges 实现某些系统变化,不重新创建activity
常见的configChanges:android:configChanges="orientation|keyboardHidden"。这样配置之后,屏幕方向发生变化后,就不会重现创建activity,即不会执行onSaveInstanceState,会执行onConfigurationChanged
activity的启动模式
-
standard:标准模式
系统默认的模式,每次启动activity都会重现创建一个实例。这些实例可以在同一个activity栈中,也可以在不同的栈中。 被启动的activity和启动它的activity在同一个栈中。比如A启动B,那么B就在A所在的栈中。
平常开发的过程中,应该遇到过这个错误:Calling startActivity from outside of an activity context requires the FLAG_ACTIVITY_NEW_TASK. Is this really what you want? 出现这个错误的场景就是:用ApplicationContext 启动一个standard模式的activity。 出现的原因:standard模式的activity默认会进入启动它的activity所属的栈中,但现在是ApplicationContext启动的,找不到对应的栈了,所以报错了。 加上这个flag:FLAG_ACTIVITY_NEW_TASK 在启动的时候,就会新建一个activity栈,类似singleInstance的启动模式了。 -
singleTop:栈顶模式
处于singleTop启动模式的activity A已经在栈顶,那么再启动一个A时,就不会创建一个新的A了,只会执行A的onNewIntent. 如果A不是在栈顶,那么就会新创建一个A,走正常的生命周期。 -
singleTask:栈内复用模式
处于singleTask的activity A已经在栈中,那么再启动A时,就不会创建A了,只会执行的onNewIntent,同时清除栈中A上面的所有activity。 如果栈中没有A,就新创建一个A,走正常的生命周期,加入到启动它的activity所在的栈中,如果是ApplicationContext启动的,就新建一个栈。 -
singleInstance:单实例模式
网友评论