有关Activity的生命周期的分析

    博客的目的就是用来做备忘录,我希望能通过有限的总结来防止遗忘,同时也能给大家带来方便,本篇主要内容来自任玉刚编写的《andorid开发艺术探索》。

    一、典型情况下的生命周期分析

   图为Activity生命周期的切换:

    有关Activity的生命周期的分析

有几点值得注意:

1、针对一个特定的Activity,第一次启动,调用onCreate->onStart->onResume

2、当用户打开新的Activity或者切换到桌面时,回调如下:onPause->onStop,这里有个特殊情况,如果新的Activity采用了透明的主题,onStop是不会调用的。

3、当用户再次回到原来的Activity时,回调:onRestart->onStart->onResume.

4、当用户按back键回退时,回调:onPause->onStop->onDestroy.

5、当Activity被系统回收后再次打开,生命周期方法回调过程和 1中所述一样;

6、从整个生命周期来看,onCreate和onDestroy是配对的,分别标识着Activity的创建和销毁,并且只可能有一次调用,从Activity是否可见来说,onStart和onStop是配对的,随着用户的操作或设备屏幕的点亮和熄灭,这两个方法可能被调用多次;从Activity是否在前台来说,onResume和onPause是配对的,随着用户操作或者设备屏幕的点亮和熄灭,这两个方法可能被调用多次。

7、Android官方文档对onPause的解释有这么一句:不能在onPause中做重量级的操作,因为必须onPause执行完,新的Activity才能Resume。总之,onPause和onStop都不能执行耗时操作,尤其是onPause,这意味着我们应当尽量在onStop中做操作,从而使得新Activity尽快显示出来并切换到前台。

二、异常情况下的生命周期分析

        1、情况1:资源相关的系统配置发生改变导致activity被杀死并重新创建

        在默认情况下,如果我们的Activity不做特殊处理,那么当系统配置发生改变后,Activity就会被销毁并重新创建,其生命周期如下图:

有关Activity的生命周期的分析

       当系统配置发生改变后,Activity会被销毁,其onPause、onStop、onDestroy均会被调用,同时由于Activity是在异常情况下终止的。系统会调用onSaveInstanceState来保存当前Activity的状态,这个方法的调用时机是在onStop之前,它和onPause没有既定的时序关系,它既可能在onPause之前调用,也可能在onPause之后调用。需要强调的一点,这个方法只会出现在Activity被异常终止的情况下,正常情况下系统不会回调这个方法,当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法保存的Bunndle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。因此,我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建,如果被重建了,那么我们就可以取出之前保存的数据并恢复,从时序上来说,onRestoreInstanceState的调用时机在onStart之后。

        注意:当Activity销毁重建后,我们再去获取之前存储的字符串。接收的位置可以选择onRestoreInstanceState或者onCreate,二者的区别是:onRestoreInstanceState一旦被调用,其参数Bundle saveInstanceState一定是有值,我们不用额外地判断是否是空,但是onCreate不行,onCreate如果是正常启动的话,其参数Bundle saveInstanceState为null,所以必须要额外判断,官方文档建议是采用onRestoreInstanceState去恢复数据。

        2.情况2:资源内存不足导致低优先级的Activity被杀死。

        Activity按照优先级从高到底,可以分为如下三种:

        (1)前台Activity——正在和用户交互的Activity,优先级最高。

        (2)可见但非前台Activity——比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法与用户直接交互。

        (3)后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低。

           当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。如果一个进程没有四大组件在执行,那么这个进程将很快被系统杀死。