Activity生命周期

一、Activity的四种状态

Activity最大的特点是拥有多种状态,可以在多种状态之间切换,以此来控制自己的生命周期。
大致有以下四种状态:

  • Active/Running:这时Activity位于前台,处于Activity栈的最顶层,可以与用户进行交互,并可以获得焦点。
  • Paused:这时Activity失去焦点,Activity栈顶被一个新的非全屏的Activity或者透明的Activity占据,意思就是此Activity还是可见的,但它失去了与用户交互的能力,但所有状态信息、成员变量还都存在。一般情况下不会被系统回收。
  • Stopped:这时Activity完全被另外一个Activity覆盖,变得不可见,失去焦点。但依然保持所有状态信息和成员变量。
  • Killed:这时Activity被系统回收掉或者该Activity从来没有创建过。

二、Activity的生命周期

在正常情况下,Activity会经历如下生命周期:

注意:正常情况是指有用户参与的情况下,Activity所经历的生命周期的改变;而异常情况是指Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁等情况。

  • onCreate:这是生命周期的第一个方法,表示Activity正在被创建。此方法只会被调用一次,我们可以在这个方法中做一些初始化工作,比如调用setContentView去加载布局,初始化Activity数据等。
  • onRestart:表示Activity正在重新启动。当当前Activity从不可见重新变为可见状态时会被调用。而这种情况一般是用户导致的,比如用户按Home键切换到桌面或者打开了一个新的Activity,这时当前的Activity就会暂停,接着再回到这个Activity时,就会调用onRestart。
  • onStart:表示Activity正在被启动。这时Activity已经显示出来,但还没有出现在前台(所以用户还看不见),无法与用户交互。
  • onResume:表示Activity已经可见,并且出现在前台并开始活动。这个状态也就是前面的Active/Running状态,此时的Activity处于Activity栈的栈顶,可以和用户进行交互。
  • onPause:表示Activity正在停止。当Activity的一部分被挡住的时候进入这个状态,此时的Activity不会接收用户输入,一般来说紧接着onStop会被调用。此时我们可做一些数据存储、停止动画等轻量级的工作,不能太耗时,否则会影响新Activity的显示。注意:onPause必须先执行完,新Activity的onResume才会执行
  • onStop:表示Activity即将停止。当Activity完全被覆盖时进入这个状态,此时Activity不可见,仅在后台运行。我们同样只能做一些轻量级的回收工作。
  • onDestrory:这时生命周期的最后一个方法,表示Activity即将被销毁。此方法也只会被调用一次。在这里,我们可以做一些回收工作和最终的资源释放。

以下是Google官方给出的Activity lifecycle图:


Activity生命周期_第1张图片
activity_lifecycle.png

三、生命周期例程分析

下面通过一个实例对Activity生命周期进行详解:

  • 首先,定义一个只含有两个Button的XML布局文件,一个叫start SecondActivity,即启动SecondActivity,另一个叫quit,即退出当前Activity。
    布局如下:

    Activity生命周期_第2张图片
    布局.png

  • 接着,在MainActivity中加载布局,定义两个Button的事件监听器后,重写生命周期的七种方法,在每个方法中使用Log打印相应的方法名。部分代码如下:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG,"onCreate");

定义quit按钮的事件监听器:

finish.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        MainActivity.this.finish();
    }
});

重写方法:

@Override
protected void onStart() {
    super.onStart();
    Log.d(TAG,"onStart");
}
  • 最后,在SecondActivity中简单布局一个TextView,输出“SecondActivity”。

我们将MainActivity设置为程序的入口,当程序启动时会自动执行该Activity,此时观察Logcat的输出,有:

第一次启动.png

然后,按一下start SecondActivity按钮,观察Logcat的输出,有:

start secondactivity.png

接着,按一下back返回键回到MainActivity,观察Logcat的输出,有:

return.png

继续,按一下HOME键,观察Logcat的输出,有:


HOME.png

再重新打开程序,观察Logcat的输出,有:


restart.png

接下来,按一下back返回键返回到桌面,观察Logcat的输出,有:


back.png

最后,按一下quit按钮,观察Logcat的输出,有:

quit.png

四、总结

从事例角度:
  • 对一个特定的Activity来说,第一次启动的回调顺序为:onCreate-->onStart-->onResume(图1)。当进入到resumed的状态时,就是用户能够看到的界面,能够与用户进行交互的界面。
  • 当用户打开新的Activity或者切换到桌面时,回调如下:onPause-->onStop(图2和图4)。这里有一种特殊情况,如果新Activity采用了透明主题,那么当前Activity不会回调onStop
  • 当用户再次回到原Activity时,回调如下:onRestart-->onStart-->onResume(图5)。
  • 当用户按back键回退到桌面时,回调如下:onPause-->onStop-->onDestory(图6)。
从配对角度:
  • 从整个生命周期来说,onCreateonDestory是配对的,分别标识着Activity的创建和销毁,并且只可能有一次调用。
  • 从Activity是否可见来说,onStartonStop是配对的,随着用户操作,这两个方法可能被多次调用。
  • 从Activity是否在前台来说,onResumeonPause是配对的,随着用户操作,这两个方法可能被多次调用。

参考资料:
《疯狂Android讲义》第三版
《Android开发艺术探索》
《Android群英传》

你可能感兴趣的:(Activity生命周期)