Activity的生命周期
分为两部分来讨论
一、典型情况下的生命周期
[—b] 正常情况下的activity会经历如下的生命周期
- onCreate:表示Activity正在被创建。在这个方法中,我们可以做一些初始化工作,比如调用setContentView去加载界面布局资源、初始化Activity所需数据等
- onRestart:表示Activity正在重新被启动,当前Activity从不可见重新变为可见状态时,onRestart就会被调用。这种情形一般是用户行为所导致的(比如用户按Home键切换到桌面或者用户打开了一个新的Activity,这时当前的Activity就会暂停,也就是onPause和onStop被执行了)接着用户又回到了这个Activity,就会出现这种情况。
- onStart:表示Activity正在被启动,即将开始,这时Activity已经可见了,但是还没有出现在前台,还无法和用户交互。这个时候其实可以理解为Activity已经显示出来了,但是我们还看不到。
- onResume:表示Activity已经可见了,并且出现在前台准备与用户进行交互。要注意这个和onStart的对比,onStart和onResume(两者的区别)都表示Activity已经可见,但是onStart的时候Activity还在后台,onResume的时候Activity才显示到前台。
- onPause:表示Activity正在暂停,正常情况下,紧接着onStop就会被调用,此时可以做一些存储数据、停止动画等工作,但是注意不能太耗时,因为这会影响到新Activity的显示,onPause必须先执行完,新Activity的onResume才会执行。
- onStop:表示Activity即将停止,可以做一些稍微重量级的回收工作
- onDestroy:表示Activity即将被销毁,这是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]
情况2:资源内存不足导致低优先级的Activity被杀死
这种情况我们不好模拟,但是其数据存储和恢复过程和情况1完全一致。 [—b] Activity按照优先级从高到低,可以分为如下三种
- 前台Activity——正在和用户交互的Activity,优先级最高。
- 可见但非前台Activity——比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法和用户直接交互。
- 后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低。
当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数数据 [—e]
|