分为两部分来讨论
一、典型情况下的生命周期 [—b]
正常情况下的activity会经历如下的生命周期
[—e]
第一次启动,回调如下:onCreate -> onStart -> onResume打开新的activity或者切回到桌面,回调如下:onPause -> onStop再次回到原Activity时,回调如下:onRestart -> onStart -> onResume按back键回退时,回调如下:onPause -> onStop -> onDestroy
[—b]
Q1:onStart和onResume、onPause和onStop从描述上来看差不多,对我们来说有什么实质的不同呢?
A1:这个问题就是回答这四个的概念
Q2:假设当前Activity为A,如果这时用户打开一个新Activity B,那么B的onResume和A的onPause哪个先执行呢?
A2:旧Activity的onPause会先执行,然后才会启动新的Activity
不能在onPause中做重量级的操作,因为必须onPause执行完成以后新Activity才能Resume
[—e]
二、异常情况下的生命周期 情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建
[—b]
Q3:由竖屏变为横屏为啥Activity就会被销毁并重新创建
A3:拿最简单的图片来说,当我们把一张图片放在drawable目录后,就可以通过Resources去获取这张图片。同时为了兼容不同的设备,我们可能还需要在其他一些目录放置不同的图片,程序启动时,系统就会根据当前设备的情况去加载合适的Resources资源,如果突然旋转屏幕,由于系统配置发生了改变,在默认情况下,Activity就会被销毁并且重新创建
onStop之前 系统会调用onSaveInstanceState来保存当前Activity的状态。当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。
也就是说onSaveInstanceState和onRestoreInstanceState 会在activity异常销毁并重建的情况下调用,因此,我们可以通过onRestoreInstanceState(在onCreate之后)和onCreate方法来判断Activity是否被重建了
Q4:关于保存和恢复View层次结构
A4:系统的工作流程是这样的:首先Activity被意外终止时,Activity会调用onSaveInstanceState去保存数据,然后Activity会委托Window去保存数据,接着Window再委托它上面的顶级容器去保存数据。顶层容器是一个ViewGroup,一般来说它很可能是DecorView。最后顶层容器再去一一通知它的子元素来保存数据,这样整个数据保存过程就完成了。可以发现,这是一种典型的委托思想,上层委托下层、父容器委托子元素去处理一件事情,这种思想在Android中有很多应用,比如View的绘制过程、事件分发等都是采用类似的思想。
总结 异常情况 多了onSaveInstanceState和onRestoreInstanceState 一个在onStop之前 一个在onCreate之后
[—e]
这种情况我们不好模拟,但是其数据存储和恢复过程和情况1完全一致。
[—b]
Activity按照优先级从高到低,可以分为如下三种
当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数数据
[—e]