android开发艺术探索 2 Activity异常情况下的生命周期分析

异常情况下的生命周期分析

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

简单说明一下系统资源的加载机制

拿最简单的图片加载机制来说,当我们把一张图片放在drawable目录后,就可以通过Resources去获取这张图片。同时为了兼容不同的设备,我们可能还需要在其他一些目录放置不同的图片,如 mdpi hdpi land等。这样当程序启动时,系统就会根据当前设备的情况去加载适合的Resources资源,比如横屏和竖屏是加载的不同的图片。

又比如当前Activity处于竖屏状态,突然旋转屏幕到横屏,由于系统配置发生改变,在默认情况下Activity就会被销毁并且重新创建,当然也有办法防止系统重新创建Activity;

在默认情况下,如果我们的Activity不做特殊处理,那么当系统配置发生改变后,activity就会销毁病重建,其生命周期如下图:

异常情况下Acitivity的重建过程

当系统配置发生改变后,Activity会被销毁,其onPause、onStop、onDestory会被调用,同时由于是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Acitivity的状态,调用时机是在onStop之前。 当Activity被重建后,系统会调用onRestoreInstanceState和onCreate方法。
因此可以通过判断onRestoreInstanceState和onCreate来判断Activity是否被重新创建了,如果被重新创建了,那就取出之前的数据并恢复,从时序上来说 onRestoreInstanceState调用是在onStart调用之后;

Activity上实际的东西是由View组成的,和Activity一样,每个view都有自己的onRestoreInstanceState和onSaveInstanceState,Activity要恢复哪些数据取决于它上面的View能够恢复哪些数据!

关于保存和恢复View的层次结构,系统的工作流程如下:
首先Activity被意外终止,Activity会调用onSaveInstanceState去保存数据,然后Activity去委托Window去保存数据,接着Window再委托它上面的顶层容器去保存数据,顶层容器是一个ViewGroup,一般来说它可能是DectorView.最后顶层容器再去一一通知他的子元素来保存数据,这样整个数据保存过程就完成了。

onSaveInstanceState只有在Activity即将被销毁并且有机会重新显示的情况下才会调用。


情况2:资源内存不足导致优先级低的Activity被杀死

Acivity优先级分类

  1. 前台Activity —————————-正在和用户交互的Activity,优先级最高
  2. 可见但非前台Activity —————Activity中弹出一个对话框,导致Activity可见但是位于后台无法和用户直接交互
  3. 后台Activity ————————– 已经被暂停的Activity,比如执行了onStop,优先级最低

当系统内存不足时,系统会按照上述的优先级来扇死目标Activity 所在的进程! 注意是进程 ,现在的android内存一般很大,这个问题可以忽略

注:当系统配置发生改变时,不想重新创建Activity,可以给Activity指定configChanges属性,这个时候如果配置发生改变调用的会是 onConfigurationChanged.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值