正常情况的生命周期分析
七大生命周期
正常情况下 Activity 的常用生命周期就是上面7个,下面是各种生命周期的切换过程:
分析上图:
- 针对一个特定的 Activity ,第一次启动,回调如下:onCreate->onStart->onResume。
- 当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause->onStop。这里有一种特殊情况,如果新Activity采用了透明主题,那么当前Activity不会回调 onStop 。
- 当用户再次回到原Activity时,回调如下:onRestart->onStart->onResume。
- 当用户按back键回退时,回调如下:onPause->onStop->onDestroy。
问题分析
通过分析源码,在新Activity启动之前,栈顶的Activity需要先 onPause 后,新Activity才能启动执行onCreate->onStart->onResume,然后Activity A才能执行onStop。
因此为了能让新Activity能快速显示出来,我们不能在 onPause 中执行耗时操作,应尽量在 onStop 中执行。
异常情况下的生命周期分析
资源相关配置发生改变导致 Activity 被杀死并重新创建
如果我们的 Activity 不做特殊处理,当系统配置发生改变后,Activity 就会被销毁并重新创建,其生命周期如图:
分析异常情况下 Activity 的重建过程:
在 onSaveInstanceState 和 onRestoreInstanceState 方法中,系统自动为我们做了一定的恢复工作。当 Activity 在异常情况下重建时,系统会默认为我们保存当前 Activity 的视图结构,并且在Activity重启后为我们恢复这些数据,比如文本框中用户输入的数据、ListView 滚动的位置等,这些 View 相关的状态系统都能够默认为我们恢复。
关于保存和恢复 View层次结构,系统的工作流程是这样的:
资源内存不足导致低优先级低的 Activity 被杀死
这种情况的数据存储和恢复过程和上述完全一致。
这里说明以下 Activity 的优先级情况。Activity 按照优先级从高到低,可以分为如下三种:
配置文件发生改变但要防止 Activity 重新创建
可以给 Activity 指定 configChanges 属性。比如不想让 Activity 在屏幕旋转的时候重新创建,就可以给 configChanges 属性添加 orientation 这个值,如果想指定多个值,可以用" | "连接起来,如下:
介绍系统配置中每个项目的含义:
添加 configChanges 属性后,Activity 在异常情况下不会重新
创建,并且也没有调用 onSaveInstanceState 和 onRestoreInstanceState 来存储和恢复数据,取而代之的时系统调用了 Activity 的 onConfigurationChanged 方法,我们可以在这个方法中做一些自己的特殊处理。