在上一篇我们介绍了Activity正常情况下的生命周期 ,还没有看过的看官请点击http://blog.csdn.net/myhead756/article/details/52209518
接下来我们要分析的就是在异常情况下Activity的生命周期又是怎么样的呢?
我们知道,Activity除了受用户操作所导致的正常的生命周期方法调度外,还有一些异常的情况,比如当资源相关的系统配置发生改变以及系统内存不足时,Activity就可能被杀死。下面我们就来具体分析这两种情况。
情况一:资源相关的系统配置发生改变导致Activity被杀死并重新创建
在默认情况下,如果我们的Activity不做特殊处理,那么当系统配置发生改变后,Activity就会被销毁并重新创建,其生命周期如下图↓
当系统配置发生改变后,Activity就会被销毁,此时onPause、onStop、onDestroy均会被调用,由于Activity是在异常情况下终止的,系统会自动调用onSaveInstanceState来保存当前Activity的状态。这个方法会在onStop之前被调用,它和onPause是并行的,即与onPause的调用没有先后顺序。在Activity被重新创建后,系统就会调用onRestoreInstanceState,并把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。因此,我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建了,如果被重建了,我们就可以取出之前保存的数据并进行恢复。从调用时机上来说,onRestoreInstanceState方法会在onStart被调用之后。在onSaveInstanceState和onRestoreInstanceState方法中,系统会自动为我们做一定的恢复工作,当Activity在异常情况下需要重新创建时,系统会默认为我们保存当前的Activity的视图结构,并且在Activity重启后为我们回复这些数据。
下面我们以旋转屏幕的方式来异常终止Activity,具体如下↓
从上面的测试可以清楚的看到,当Activity在异常终止时,会调用onSaveInstanceState来保存数据,在重新创建以后在onCreate和onRestoreInstanceState中都能正确的恢复我们保存的数据。针对onSaveInstanceState方法还有一点需要说明的地方,那就是系统只会在Activity即将被销毁并且有机会重新显示的情况下才会去调用它。当Activity正常销毁的时候,系统不会调用onSaveInstanceState,因为被销毁的Activity不可能再次被显示。
情况二:资源内存不足导致优先级比较低的Activity被杀死
这种情况我们不好模拟,但是它的数据存储和恢复过程与情况一是完成一致的,在这里我们来描述一下Activity的优先级情况。Activity按照优先级从高到底,可以分为三种:
(1)前台Activity——正在和用户交互的Activity,优先级最高
(2)可见但是非前台Activity——比如Activity弹出了一个对话框,这个时候Activity可见,但是是位于后台,无法与用户直接交互。
(3)后台Activity——已经被停止了的Activity,执行了onStop,此时对用户不可见。优先级最低,最容易导致被回收。
那么如果我们想在系统配置发生改变后,不重新创建Activity又改肿么办呢?答案就是可以给Activity指定configChanges属性。
比如我们不想让Activity在屏幕旋转时重新创建,只需要在Activity配置时加入下面这句代码
android:configChanges="orientation"
如果我们想指定多个值,可以用“|”连接起来。下面是configChanges的每个项目及说明↓
下面我们就来使用configChanges看一看具体如何吧
接下来只需要在AndroidManifest,xml配置相关熟悉,请看下面代码
那我们再来看一下具体结构如何
可以看到,Activity并没有被重新创建,onSaveInstanceState和onRestoreInstanceState也没有并调用,而是调用了onConfigurationChanged方法,我们只需要在onConfigurationChanged中做一些特殊处理就可以啦,是不是很方便呢!
到这里,我们的Activity的生命周期相关的部分就介绍得差不多啦。如果想深入的童鞋可以查看Android源码了解具体实现流程,在这里我就不多说啦。