Activity的生命周期(二)

在上一篇我们介绍了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源码了解具体实现流程,在这里我就不多说啦。


奋斗奋斗奋斗奋斗奋斗奋斗


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值