Activity的生命周期全面分析
正常情况下的生命周期
(1)针对一个特定的Activity,第一次启动,回调如下:onCreate->onStart->onResume。
(2)当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause->onStop。这里有一个特殊情况,如果新Activity采用透明主题,那么当前Activity不会回调onStop。
(3)当用户在此回到原Activity时,回调如下:onRestart->onStart->onResume。
(4)当用户按下back键回退时,回调如下:onPause->onStop->onDestory。
(5)当Activity被系统回收后再次打开,生命周期方法回调过程和(1)一样,注意是生命周期方法一样,不代表所有过程都一样。
(6)从整个生命周期来说,onCreate和onDestory是配对的,分别标识着Activity的创建和销毁,并且只可能有一次调用。从Activity是否可见来说,onStart和onStop是配对的,随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法可能被调用多次;从Activity是否在前台来说,onResume和onPause是配对的,随着用户操作或者设备屏幕的点亮和熄灭,这两个方法可能被调用多次。
(7)当前Activity为A,如果这时用户打开一个新的ActivityB,那么回调如下:A-onResume->A-onPause->B-onCreate->B-onStart->B-onResume->A-onStop。
异常情况下生命周期
1)资源相关的系统配置发生改变导致Activity被杀死并重新创建
在默认情况下,如果我们的Activity不做特殊处理,那么当前系统配置发生改变后,Activity就会被销毁并重新创建。其onPause、onStop、onDestory均会被调用,同时由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态。这个方法的调用时机是在onStop之前,它和onPause没有既定的时序关系,它既可能在onPause之前也可能在之后。这个方法只会出现在Activity被异常终止的情况下,正常情况下系统不会调用此方法。当Activity被重新创建后,系统会调用onRestoreInstance,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。因此我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建了,如果被重建了,那么我们就可以取出之前保存的数据并恢复从时序上来说,onRestoreInstanceState的调用时机在onStart之后。
(2)资源内存不足导致低优先级的Activity被杀死
a、前台Activity——正在和用户交互的Activity,优先级最高。
b、可见但非前台Activity——比如Activity中弹出一个对话框,导致Activity可见但是位于后台无法和用户直接交互。
c、后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低。
可以给Activity指定configChanges属性。防止Activity重建
android:configChanges="orientation|keyboardHidden"