android activity 生命周期

android activity 生命周期

1.基本知识

  在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
  下图详细描述了这一过程。

从上图所示的Activity生命周期不难看出,在这个图中包含了两层循环,
第一层循环是onPause -> onResume -> onPause,
第二层循环是onStop -> onRestart -> onStart -> onResume -> onPause -> onStop。我们可以将这两层循环看成是整合Activity生命周期中的子生命周期。第一层循环称为焦点生命周期,第二层循环称为可视生命周期。也就是说,第一层循环在Activity焦点的获得与失去的过程中循环,在这一过程中,Activity始终是可见的。而第二层循环是在Activity可见与不可见的过程中循环,在这个过程中伴随着Activity的焦点的获得与失去。也就是说,Activity首先会被显示,然后会获得焦点,接着失去焦点,最后由于弹出其他的Activity,使当前的Activity变成不可见。因此,Activity有如下3种生命周期:
    整体生命周期:onCreate -> ... ... -> onDestroy。
    可视生命周期:onStop -> ... ... -> onPause。
    焦点生命周期:onPause -> onResume。
注意:在图1所示的Activity生命周期里可以看出,系统在终止应用程序进程时会调用onPause、onStop和onDesktroy方法。而onPause方法排在了最前面,也就是说,Activity在失去焦点时就可能被终止进程,而onStop和onDestroy方法可能没有机会执行。因此,应该在onPause方法中保存当前Activity状态,这样才能保证在任何时候终止进程时都可以执行保存Activity状态的代码。
  activity主要生命周期的方法说明:
onCreate(Bundle savedInstanceState):创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!
onStart():activity变为在屏幕上对用户可见时调用。
onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。
onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!
onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。
onDestroy():activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用onFinish()方法或者系统决定停止该活动以释放资源!

2.事件方法链
    2.1  进入Activity
      onCreate  -> onStart  ->  onResume
    2.2  BACK键
      onPause -> onStop -> onDestroy
    2.3  HOME键
      Home键退出:onPause -> onStop
      Home键回来:onRestart ->  onStart -> onResume 
    2.4  休眠/恢复
      休眠:  onPause
      恢复:  onResume
    2.5  旋转屏幕
      未设置android:configChanges:
        onPause  ->  onStop  ->  onDestory  ->  onCreate  -> onStart  ->  onResume
      设置了android:configChanges="orientation|keyboardHidden":
          不会触发生命周期方法,参见文章这里。
    2.6  来电
      来电,显示来电界面:
        onPause  ->  onStop
      关闭电话界面,重新回到当前Activity:
        onRestart ->  onStart -> onResume
    2.7  其他Activity
      进入下一个Activity:
        onPause  ->  onStop
      从其他Activity返回至当前Acitivity:onRestart ->  onStart -> onResume

3.与Activity生命周期结合的应用场景
    3.1  与广播(Broadcast)结合
      在onResume注册广播(registerLinstener),在onPause注销广播(unregisterLinstener)。 例如:
      做"摇一摇"功能(传感器)、监听网络变化,就可以在onResume中注册监听,在onPause里注销掉,已节省资源提高效率。
    3.2  与服务(Service)结合
      在onStart绑定服务(bindService),在onStop中取消绑定(unbindService)。 例如:
      需要通过Service定时更新UI上的数据,而Activity的可见周期在onStart与onStop之间,那么就可以再onStart时启动服务,在onStop时停止服务。为了节约系统资源,除了提高用户体验以外,开发人员应尽可能的优化程序。
    3.3  与Cursor结合
      使用managedQuery让Activity帮你管理Cursor的生命周期,不用自己去close。但也有一些问题,补充两篇文章:这里1、 这里2。
    3.4  释放资源
      可以在onDestory中释放一些资源。比如可以在onDestory时调用MediaPlayer的release。
4、注意
    4.1  所有Activity生命周期方法的实现都必须先调用其父类版本。
    4.2  由于Activity经常会暂停和恢复之间切换,所以onResume和onPause这两个方法应当是轻量级的。
    4.3  在系统再某种紧急情况下需要回收内存,onStop、onDestory可能不会被调用,因此需要在onPause中把需要长期保存的数据保存起来。

posted @ 2014-08-05 11:29  狐狸已化妖  阅读(633)  评论(0编辑  收藏  举报