异常情况下Activity生命周期



异常情况包括两种

1. 资源相关的系统配置发生改变导致Activity被杀死后并重新创建。

2. 内存不足导致的低优先级Activity被杀死。


第一种情况包括的操作有:屏幕方向旋转,系统语言设置改变改变(系统语言改变会导致app去app内对应string资源中去加载语言)等

例如:

(1)当启动一个Activity,然后回到桌面,去设置中修改语言,然后再次点击该应用图标开启该应用时,activity的生命周期如下 

                    当按下home键时(蓝色框)执行了onStop,在修改完系统语言后,再次回到应用时(黄色框),这时才执行了onDestroy,然后新创建了activity

异常情况下Activity生命周期_第1张图片



(2)当前activity正在显示时旋转屏幕并导致屏幕显示方向改变时,activity的生命周期如下 

该情况和上面相同。

异常情况下Activity生命周期_第2张图片


总结: 当资源相关的系统配置改变时,会销毁原activity,onPause,onStop,onDestroy都会执行,并会调用onSaveInstanceState(先于onStop方法执行),

当activity被重新创建后,会执行onCreate和onRestoreInstanceState,并把销毁前保存的数据传进来。onRestoreInstanceState只有异常终止activity并重新创建后才会调用,但onSaveInstanceState每次都会执行,不管activity是否异常终止(小米note 4.4.4,安卓6.0模拟器亲测都会执行,与android开发艺术探索中第9页描述有出入,另外书中说activity异常终止时,会自动调用所有view 的onSaveInstanceState方法,实测不管是异常终止Activity还是正常终止,都不会调用view的onSaveInstanceState方法)。



第二种情况, 内存不足导致的低优先级Activity被杀死。
当内存不足时,系统会按activity优先级杀死activity
Activity优先级从高到低克分为:
(1)前台Activity,正在和用户交互的Activity,优先级最高
(2)可见但非前台Activity,例如Activity中弹出对话框,导致activity可见但是无法和用户交互
(3)后台Activity,已经被暂停的Activity,比如执行了onStop。

ps:android开发艺术探索第13页说系统按照上述优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState恢复数据,对于这点我持怀疑态度,杀死的确定是 进程 吗?进程都杀死了还能恢复数据?实测在模拟器中开启activity后然后按home键,然后修改系统语言,然后去系统设置中结束应用,然后再次开启应用,并没有发现执行activity的onSaveInstanceState和onRestoreInstanceState方法
  
 

题外话:
当系统配置改变后可以不重建Activity吗?当然可以,比如不想屏幕旋转就新建activity时,可以在清单中给activity中添加android:configChanges="orientation|screenSize" , 这样虽然屏幕也会旋转,但activity不会重新创建,即不会执行onCreate,onStart,onResume。





你可能感兴趣的:(android)