Activity异常终于时的Lifecycle
11/7: activity异常启动的情况下生命周期分析:
1.情况一:资源相关的系统配置发生改变时候,会导致Activity杀死并重建
当Activity因为异常情况被杀死时候,会在onStop()之前回调onSaveInstanceState()来保存当前Activity的状态,和onPause()无顺序先后。
注意:onSaveInstanceState只会在Activity被异常终止时候被调用,而正常情况不会回调。
当Activity被重新创建时,就会回调onRestoreInstanceState(),并将Activity在异常销毁时保存在onSaveInstanceState()Bundle对象传递给onRestoreInstanceState() 和onCreate(),那么我们就可以从保存的数据中将数据恢复。
当Activity被异常销毁并重建时,就会通过onSaveInstanceState和 onRestoreInstanceState恢复Activity的视图结构,如文本框里恢复用户输入的数据、listview恢复滑动的位置,具体view恢复什么数据,这个要从view的onSaveInstanceState、onRestoreInstanceState()来看了。
从时序来看,onRestoreInstanceState()在onStart()之前。
关于保存和恢复View的层次结构,系统的工作流程:
Activity异常终止回调onSaveInstanceState去保存数据,然后Activity会委托上层Window去保存, window会委托上层父容器ViewGroup(一般是DecorView)去保存,然后父容器再一一通知其子view分别保存数据,这样就完成了保存数据的流程,这是一种典型的委托思想,上层委托下层,父容器委托子元素来完成。在Android中View的绘制、事件分发过程都是这种典型思想。
异常终止情况:屏幕旋转
面试问:如何避免配置改变导致的Activity的重建呢?
答:为Activity指定configChanges属性,例如,不想要屏幕旋转时Activity的重建,就为configChanges属性添加“oritation",书写如下:
android:configChanges="oritation";
如果想指定多个,就用“|”,如下:
android:configChanges="oritation|keyboardHidden";
常用的configChanges:
oritation 屏幕方向发生改变,比如旋转了手机屏幕
keyboard 键盘类型发生了改变,比如用户使用了外接键盘
keyboardHidden:键盘的可访问性发生了改变,比如用户调出了键盘
当指定后,会发现Acitivty不再重建,即onSaveInstanceState() onRestoreInstanceState()不会调用,而会调用onConfigurationChanged()会调用。
2、资源内存不足,导致优先级低的Activity被杀死。
Activity优先级分为以下:
1.前台Activity--可和用户交互
2、可见非前台 ---如弹出个Dialog的activity
3、后台不可见,即执行了onstop()
so内存不足时,会先去杀死优先级低的Activity。如果一个进程中没有四大组件在运行,就会先被杀死,所以,一些后台工作不宜脱离四大组件在后台运行。可以将后台工作放在service, 从而保证进程一定的优先级,从而不会轻易被系统杀死。