Activity生命周期
·典型情况下的生命周期
——有用户参与的情况下,Activity所经过的生命周期的改变。
具体如下图:
注意:
①onStart()和onResume():前者执行时Activity还在后台,无法和用户进行交互;后者执行时Activity显示到前台。
②当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause -> onStop。特殊情况:新Activity采用透明主题,那么当前Activity不会回调onStop。
③onStart和onStop是从Activity是否可见的角度来回调的,而onResume和onPause是从Activity是否位于前台的角度来回调的。
④栈顶的Activity需要先onPause后,新Activity才能启动。
⑤onPause和onStop都不能执行耗时的操作,尤其是onPause,应尽量在onStop中做操作,才能使新的Activity尽快显示出来并切换到前台。
·异常情况下的生命周期
——Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建。
情况1:
资源相关的系统配置发生改变导致Activity被杀死并重新创建。如横竖屏的切换。
默认情况下,当系统配置发生改变后,Activity就会被销毁并重新创建,如下:
①在onStop之前(可能在onPause之前或之后)调用onSaveInstanceState来保存当前Activity的状态,只会在Activity被异常终止的情况下出现该方法。
②当Activity被重新创建后,系统会调用onRestoreInstanceState,把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。
③在上述两个方法中,判断Activity是否被重建,重建,就可去除之前保存的数据并恢复,onRestoreInstanceState的调用时机在onStart之后。
恢复和保存View层次结构,系统的工作流程(委托思想——上层委托下层、父容器委托子元素去处理一件事情):
1. Activity被意外终止时,Activity会调用onSaveInstanceState去保存数据
2. Activity委托Window去保存数据
3. Window委托它上面的顶层容器去保存数据。(顶层容器是一个ViewGroup,一般来说它很可能是DecorView)
4. 顶层容器再去一一通知它的子元素来保存数据
以上为保存,恢复类似。
关于ViewGroup和DecorView,可参考:http://www.cnblogs.com/l2rf/p/6099170.html
情况2:
资源内存不足导致低优先级的Activity被杀死。(存储和恢复过程同情况1)
优先级从高到低:
1. 前台Activity——正在和用户交互的Activity,优先级最高
2. 可见但非前台Activity——比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法和用户直接交互。
3. 后台Activity——已经被停止的Activity,比如执行了onStop,优先级最低。
如果一个进程没有四大组件在执行,那么这个进程将很快被杀死。所以对于后台工作,应放在Service中从而保证有一定的优先级。
系统配置发生改变后,不想重新创建Activity:给Activity指定configChanges属性。如不想让Activity在屏幕旋转的时候重新创建,可以在AndroidManifest.xml文件中该Activity的<activity>标签中添加:android:configChanges=”orientation”。
具体的configChanges的项目和含义可自行查找,此处不一一列举了。