Activity生命周期
典型情况下的生命周期
在通常情况下,Activity会经历如下生命周期:
- onCreate 表示Activity正在被创建,是生命周期的第一个方法,在这个方法中,我们可以做一些初始化的工作,例如调用setConcentView去加载界面布局资源、初始化Activity所需数据等。
- onRestart 表示Activity正在重新启动,一般情况下,在当前Activity从不可见状态变更为可见状态时,onRestart就会被调用。
- onStart 表示Activity正在被启动,即将开始,这时Activity以ing可见了,但是没有出现在前台,还无法和用户交互。可以理解为Activity已经显示出来了,但是还无法看到。
- onResume 表示Activity已经可见了,并且出现在前台并且开始活动。onStart的时候,Activity还在后台,onResume的时候,Activity才显示到前台。
- onPause 表示Activity正在停止,正常情况下,紧接着onStop就会被调用。此时可以做一些数据存储、停止动画、取消监听等工作,但是不能太耗时,避免影响到新Activity的显示。
- onStop 表示Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
- onDestory 表示Activity即将被销毁,这是Activity生命周期中的最后一个回调方法,在这里,我们可以做一些回收工作和最终的资源释放。
如下情况生命周期方法调用顺序:
- 针对一个特定的Activity,第一次启动,回调如下:onCreate->onStart->onResume。
- 当用户打开新的Activity或者切换到桌面时,回调如下:onPause->onStop。当新Actiity采用了透明主题,则不会调用onStop。
- 当用户在此回到原Activity时,回调如下:onRestart->onStart->onResume。
- 当用户按返回键回退时,回调如下:onPause->onStop->onDestory。
- 当Activity被系统回收后再次打开,回调如下:onCreate->onStart->onResume。
- 从整个生命周期来看,onCreate和onDestory是配对的,分别标识着Activity的创建和销毁,并且只可能有一次调用。从Activity是否可见来看,onStart和onStop是配对的,随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法可能被调用多次;从Activity是否在前台来说,onResume和onPause是配对的,随着用户操作或者设备的点亮和熄灭,这两个方法可能被多次调用。
异常情况下的生命周期
1.资源相关的系统配置发生改变导致Activity被杀死并重新创建
在默认情况下,如果我们的Activity不做特殊处理,那么当系统配置发生改变后,Activity就会被销毁并重新创建,生命周期如图所示。
当系统配置发生改变后,Activity会被销毁,其onPause、onStop、onDestory均会被调用,同时由于Activity时在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态。这个方法的调用时机时在onStop之前,它和onPause没有既定的时序关系,这个方法只会在Activity被异常终止的情况下调用。当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。从时序上来看,onRestoreInstanceState的调用时机在onStart之后。要想知道系统能够为每个View恢复哪些数据,需要去源码中查看onSaveInstanceState和onRestoreInstanceState中保存了哪些数据。
关于保存和恢复View层次结构,系统的工作流程如下。
首先:Activity被意外终止时,Activity会调用onSaveInstanceState去保存数据,然后Activity会委托Window去保存数据,接着Window再委托它上面的顶级容器去保存数据。顶层容器是一个ViewGroup,一般来说它很可能是DecorView。最后顶层容器再去一一通知它的子元素来保存数据,从而完成整个数据保存过程。
2.资源内存不足导致低优先级的Activity被杀死
Activity的优先级从高到低分为如下三种:
(1)前台Activity
正在和用户交互的Activity,优先级最高
(2)可见但非前台Activity
例如Activity中弹出了一个对话框,导致Activity可见,但是无法和用户直接交互。
(3)后台Activity
已经被暂停的Activity,例如执行了onStop,优先级最低。
当系统资源不足时,系统会按照优先级去杀死目标Activity所在进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。如果不希望Activity在系统配置发生改变的时候被重新创建,可以给Activity指定ConfigChanges属性,多个值用|隔开。
ancroid:configChanges="orientation|locle"
系统配置中所包含的项目比较多,如下图所示。
configChanges的项目和含义图片来源于网络
网友评论