Android开发权威指南(第二版)
上QQ阅读APP看书,第一时间看更新

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个生命周期