5.2 Activity的生命周期
源代码目录:src/ch05/ActivityCycle
在Activity从创建到销毁的过程中需要在不同的阶段调用7个生命周期方法。这7个生命周期方法的定义如下:
protected void onCreate(Bundle savedInstanceState)
protected void onStart()
protected void onResume()
protected void onPause()
protected void onStop()
protected void onRestart()
protected void onDestroy()
上面7个生命周期方法分别在4个阶段按一定的顺序进行调用,这4个阶段如下。
开始Activity:在这个阶段依次执行3个生命周期方法,分别是onCreate、onStart和onResume。
Activity失去焦点:如果在Activity获得焦点的情况下进入其他的Activity或应用程序,当前的Activity会失去焦点。在这一阶段会依次执行onPause和onStop方法。
Activity重新获得焦点:如果Activity重新获得焦点,会依次执行3个生命周期方法,分别是onRestart、onStart和onResume。
关闭Activity:当Activity被关闭时系统会依次执行3个生命周期方法,分别是onPause、onStop和onDestroy。
如果在这4个阶段执行生命周期方法的过程中不发生状态的改变,系统会按上面的描述依次执行这4个阶段中的生命周期方法,但如果在执行过程中改变了状态,系统会按更复杂的方式调用生命周期方法。
在执行的过程中可以改变系统的执行轨迹的生命周期方法是onPause和onStop。如果在执行onPause方法的过程中Activity重新获得了焦点,然后又失去了焦点,系统将不会再执行onStop方法,而是按如下顺序执行相应的生命周期方法:
onPause -> onResume-> onPause
如果在执行onStop方法的过程中Activity重新获得了焦点,然后又失去了焦点,系统将不会执行onDestroy方法,而是按如下顺序执行相应的生命周期方法:
onStop→onRestart→onStart→onResume→onPause→onStop
图5-14描述了Activity从创建到销毁以及中间状态的改变后调用生命周期方法的过程。
▲图5-14 Activity的生命周期
从图5-14所示的Activity生命周期方法调用示意图不难看出,在整个Activity的生命周期中包含两层循环,第一层循环是onPause→onResume→onPause,第二层循环是onStop→onRestart→onStart→onResume→onPause→onStop。我们可以将这两层循环看成是整个Activity生命周期中的子生命周期。第一层循环称为焦点生命周期,第二层循环称为可视生命周期。也就是说,第一层循环在Activity焦点的获得与失去的过程中循环,在这一过程中,Activity始终是可见的。第二层循环是在Activity可见与不可见的过程中循环,在这个过程中伴随着Activity焦点的获得与失去。也就是说,Activity首先会被显示,然后会获得焦点,接着失去焦点,最后由于弹出其他的Activity,使当前的Activity变成不可见。因此,Activity有如下3种生命周期:
整体生命周期:onCreate→……→onDestroy。
可视生命周期:onStart→……→onStop。
焦点生命周期:onResume→onPause。
下面的代码分别在Activity类中的7个生命周期方法中输出了日志信息,读者可以根据下面的操作步骤观察日志的输出顺序。
源代码文件:src/ch05/ActivityCycle/src/mobile/android/activity/cycle/CycleActivity.java
package mobile.android.activity.cycle;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class CycleActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.d("onCreate", "onCreate Method is executed.");
}
@Override
protected void onDestroy()
{
super.onDestroy();
Log.d("onDestroy", "onDestroy Method is executed.");
}
@Override
protected void onPause()
{
super.onPause();
Log.d("onPause", "onPause Method is executed.");
}
@Override
protected void onRestart()
{
super.onRestart();
Log.d("onRestart", "onRestart Method is executed.");
}
@Override
protected void onResume()
{
super.onResume();
Log.d("onResume", "onResume Method is executed.");
}
@Override
protected void onStart()
{
super.onStart();
Log.d("onStart", "onStart Method is executed.");
}
@Override
protected void onStop()
{
super.onStop();
Log.d("onStop", "onStop Method is executed.");
}
}
注意
在Activity的子类中实现这7个生命周期方法时应该在这些方法的一开始调用Activity类中的生命周期方法(如super.onCreate),否则系统会抛出异常。
读者可按如下步骤来操作应用程序。
第1步:在Android模拟器上运行程序。
第2步:按Android模拟器上的接听电话按钮(如图5-15所示)进入“通话记录”界面,然后退出这个界面。
▲图5-15 接听按钮
第3步:退出应用程序。
完成上面3步后,在LogCat视图中可以看到如图5-16所示的输出信息。
图5-16所示的输出信息是在Activity生命周期的4个阶段输出的调试信息,除此之外,还有一些系统输出的信息。读者可以在“Filter”文本框中输入“executed”过滤掉其他信息,过滤效果如图5-17所示。
▲图5-16 Activity生命周期的4个阶段输出的信息
从图5-16所示的4组输出信息也可以看出Activity的3个生命周期,为了看起来更方便,使用黑框将这3个生命周期要调用的方法括起来,如图5-18所示。
▲图5-17 只显示在生命周期方法中输出的调试信息
▲图5-18 Activity的3个生命周期