一、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生命周期进行详解:
-
首先,定义一个只含有两个Button的XML布局文件,一个叫
start SecondActivity
,即启动SecondActivity,另一个叫quit
,即退出当前Activity。
布局如下:
接着,在
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的输出,有:
然后,按一下start SecondActivity
按钮,观察Logcat的输出,有:
接着,按一下back返回键回到MainActivity
,观察Logcat的输出,有:
继续,按一下HOME键,观察Logcat的输出,有:
再重新打开程序,观察Logcat的输出,有:
接下来,按一下back返回键返回到桌面,观察Logcat的输出,有:
最后,按一下quit
按钮,观察Logcat的输出,有:
四、总结
从事例角度:
- 对一个特定的Activity来说,第一次启动的回调顺序为:
onCreate-->onStart-->onResume
(图1)。当进入到resumed
的状态时,就是用户能够看到的界面,能够与用户进行交互的界面。 - 当用户打开新的Activity或者切换到桌面时,回调如下:
onPause-->onStop
(图2和图4)。这里有一种特殊情况,如果新Activity采用了透明主题,那么当前Activity不会回调onStop
。 - 当用户再次回到原Activity时,回调如下:
onRestart-->onStart-->onResume
(图5)。 - 当用户按back键回退到桌面时,回调如下:
onPause-->onStop-->onDestory
(图6)。
从配对角度:
- 从整个生命周期来说,
onCreate
和onDestory
是配对的,分别标识着Activity的创建和销毁,并且只可能有一次调用。 - 从Activity是否可见来说,
onStart
和onStop
是配对的,随着用户操作,这两个方法可能被多次调用。 - 从Activity是否在前台来说,
onResume
和onPause
是配对的,随着用户操作,这两个方法可能被多次调用。
参考资料:
《疯狂Android讲义》第三版
《Android开发艺术探索》
《Android群英传》