Android Activity生命周期具体内容概述

来源:互联网 发布:淘宝去同款排除王 编辑:程序博客网 时间:2024/04/28 06:02

对手机有所研究的朋友们,应该对于Android这一手机操作系统并不陌生。它是一款基于Linux平台的开源手机操作系统。我们在这里会通过对Android Activity生命周期的介绍来充分的了解一下这一系统的基本原理。

注意到在Activity的API中有大量的onXXXX形式的函数定义,除了我们前面用到的onCreate以外,还有onStart,onStop以及onPause等等。从字面上看,它们是一些事件回调,那么次序又是如何的呢?其实这种事情,自己做个实验最明白不过了。在做这个实验之前,我们先得找到在Android中的Log是如何输出的。

显然,我们要用的是android.util.log类,这个类相当的简单易用,因为它提供的全是一些静态方法:

  1. Log.v(String tag, String msg); //VERBOSE  
  2. Log.d(String tag, String msg); //DEBUG   
  3. Log.i(String tag, String msg); //INFO  
  4. Log.w(String tag, String msg); //WARN  
  5. Log.e(String tag, String msg); //ERROR 

前面的tag是由我们定义的一个标识,一般可以用“类名_方法名“来定义。

输出的LOG信息,如果用Eclipse+ADT开发,在LogCat中就可以看到,否则用adb logcat也行,不过我是从来都依赖于IDE环境的。

好了,现在我们修改前面的HelloThree代码:

  1. public void onStart()  
  2. ...{  
  3. super.onStart();  
  4. Log.v(TAG,"onStart");  
  5. }  
  6. public void onStop()  
  7. ...{  
  8. super.onStop();  
  9. Log.v(TAG,"onStop");  
  10. }  
  11. public void onResume()  
  12. ...{  
  13. super.onResume();  
  14. Log.v(TAG,"onResume");  
  15. }  
  16. public void onRestart()  
  17. ...{  
  18. super.onRestart();  
  19. Log.v(TAG,"onReStart");  
  20. }  
  21. public void onPause()  
  22. ...{  
  23. super.onPause();  
  24. Log.v(TAG,"onPause");  
  25. }  
  26. public void onDestroy()  
  27. ...{  
  28. super.onDestroy();  
  29. Log.v(TAG,"onDestroy");  
  30. }  
  31. public void onFreeze(Bundle outState)  
  32. ...{  
  33. super.onFreeze(outState);  
  34. Log.v(TAG,"onFreeze");  

在HelloThreeB中也同样增加这样的代码,编译,运行一下,从logcat中分析输出的日志。

在启动第一个界面Activity One时,它的次序是:

  1. onCreate (ONE) - onStart (ONE) - onResume(ONE)  


虽然是第一次启动,也要走一遍这个resume事件。然后,我们点goto跳到第二个Activity Two中(前一个没有关闭),这时走的次序是:

  1. onFreeze(ONE) - onPause(ONE) - onCreate(TWO) - 
    onStart(TWO) - onResume(TWO) - onStop(ONE) 

说明,第二个Activity Two在启动前,One会经历一个:冻结、暂停的过程,在启动Two后,One才会被停止?

然后,我们再点back回到第一个界面,这时走的次序是:

  1. onPause(TWO) - onActivityResult(ONE) - onStart(ONE) - 
    onRestart(ONE) - onResume(ONE) - onStop(TWO) - onDestroy(TWO) 

说明,返回时,Two没有经历冻结就直接暂停了,在One接收参数,重启后,Two就停止并被销毁了。最后,我们点一下Exit退出应用,它的次序是:

  1. onPause(ONE) - onStop(ONE) - onDestroy(ONE) 

说明如果我们用了finish的话,不会有freeze,但是仍会经历pause - stop才被销毁。

这里有点疑问的是:为什么回来时先是Start才是Restart?可是文档中的图上画的却是先restart再start的啊?不过,后面的表格中的描述好象是正确的,start后面总是跟着resume(如果是第一次)或者restart(如果原来被stop掉了,这种情况会在start与resume 中插一个restart)。

下面不跑例子了,看看Android Activity生命周期的文档吧。

 

1.Android用Activity Stack来管理多个Activity,所以呢,同一时刻只会有最顶上的那个Activity是处于active或者running状态。其它的Activity都被压在下面了。

 

2. 如果非活动的Activity仍是可见的(即如果上面压着的是一个非全屏的Activity或透明的Activity),它是处于paused状态的。在系统内存不足的情况下,paused状态的Activity是有可被系统杀掉的。只是不明白,如果它被干掉了,界面上的显示又会变成什么模样?看来下回有必要研究一下这种情况了。

 

3.几个事件的配对可以比较清楚地理解它们的关系。Create与Destroy配成一对,叫entrie lifetime,在创建时分配资源,则在销毁时释放资源;往上一点还有Start与Stop一对,叫visible lifetime,表达的是可见与非可见这么一个过程;最顶上的就是Resume和Pause这一对了,叫foreground lifetime,表达的了是否处于激活状态的过程。

 

4.因此,我们实现的Activity派生类,要重载两个重要的方法:onCreate()进行初始化操作,onPause()保存当前操作的结果。

 

除了Activity Lifecycle以外,Android还有一个Process Lifecycle的说明:

在内存不足的时候,Android是会主动清理门户的,那它又是如何判断哪个process是可以清掉的呢?文档中也提到了它的重要性排序:

 

1. 最容易被清掉的是empty process,空进程是指那些没有Activity与之绑定,也没有任何应用程序组件(如Services或者IntentReceiver)与之绑定的进程,也就是说在这个process中没有任何activity或者service之类的东西,它们仅仅是作为一个cache,在启动新的 Activity时可以提高速度。它们是会被优先清掉的。因此建议,我们的后台操作,最好是作成Service的形式,也就是说应该在Activity中启动一个Service去执行这些操作。

 

2.接下来就是background activity了,也就是被stop掉了那些activity所处的process,那些不可见的Activity被清掉的确是安全的,系统维持着一个 LRU列表,多个处于background的activity都在这里面,系统可以根据LRU列表判断哪些activity是可以被清掉的,以及其中哪一个应该是最先被清掉。不过,文档中提到在这个已被清掉的Activity又被重新创建的时候,它的onCreate会被调用,参数就是onFreeze时的那个Bundle。不过这里有一点不明白的是,难道这个Activity被killed时,Android会帮它保留着这个Bundle吗?

 

3.然后就轮到service process了,这是一个与Service绑定的进程,由startService方法启动。虽然它们不为用户所见,但一般是在处理一些长时间的操作(例如MP3的播放),系统会保护它,除非真的没有内存可用了。

 

4.接着又轮到那些visible activity了,或者说visible process。前面也谈到这个情况,被Paused的Activity也是有可能会被系统清掉,不过相对来说,它已经是处于一个比较安全的位置了。

 

5.最安全应该就是那个foreground activity了,不到迫不得已它是不会被清掉的。这种process不仅包括resume之后的activity,也包括那些onReceiveIntent之后的IntentReceiver实例。

 

在Android Activity生命周期的讨论中,文档也提到了一些需要注意的事项:因为Android应用程序的生存期并不是由应用本身直接控制的,而是由 Android系统平台进行管理的,所以,对于我们开发者而言,需要了解不同的组件Activity、Service和IntentReceiver的生命,切记的是:如果组件的选择不当,很有可能系统会杀掉一个正在进行重要工作的进程。

 

 

组件的生命周期

应用程序组件都有一个生命周期,从响应Intent的Android实例开始到这个实例被销毁。在这期间,他们或许有效或许无效,有效时或许对用户可见或许不可见。下面我们就来讨论四个基本组件的生命周期,包括在生命周期内的各种状态,以及状态之间的转换。这几种状态可能的结果是:进程让他们停止, 然后实例被销毁。

activity生命周期

一个activity有三个基本的状态:

@ 当activity在前台运行时(在activity当前任务的堆栈顶),为活动或者运行状态。这时activity会响应用户的操作。

@ 当activity失去焦点但是对用户仍然可见时为paused暂停状态。此时,别的activity在他的上面,透明或者备有被全部覆盖。所以其中一些暂停的activity也可以被显示。一个暂停的activity是处于活动状态的(他维护着所有的状态保存着信息,并且依然附着在窗口管理器)。

@ 如果一个activity完全被另一个activity所掩盖那他会处于stop状态。但仍然保存着原来的状态和信息。然而,如果别的地方需要更多的内存而且这个activity仍一直处于隐藏状态,那么系统有可能会杀死他的进程。

如果一个activity是暂停或者停止状态,系统可以清理他们占用的内存,或者调用finish()方法,或者直接结束他的进程。当他再次显示给用户时,会完全的重新运行并且加载以前所存储的信息。

activity状态之间的转换,是通过以前的受保护方法完成的:

void onCreate(Bundle savedInstanceState)

void onStart()

void onRestart()

void onResume()

void onPause()

void onStop()

void onDestroy()

这些都是钩子函数,你可以重写他们,当状态改变时做一些适当的处理。所有的activity在首次运行时必须实现onCreate()方法来初始化安装。activity可以实现onPause()来提交数据改变,然后准备停止与用户的交互。

调用超类

每一个实现的activity生命周期方法都会先调用一下父类的方法,例如:

view plaincopy to clipboardprint?
protected void onPause() {   
    super.onPause();   
    . . .   

protected void onPause() {
    super.onPause();
    . . .
}

通过这两者比较?,这7个方法定义了一个activity的整个生命周期的方法。你可以实现并且监测这三个嵌套循环:

@ 整个生命周期

调用onCreate()方法和onDestroy()之间称为一个activity的完整的生命周期。activity会在onCreate()里执行所有的初始化安装,在onDestroy()方法里释放所有的剩余资源。例如:一个从网络下载程序的线程,就需要在onCreate()方法里创建,在onDestroy()方法里销毁。

@ 可见生命周期

可见生命周期是从onStart()方法到onStop()方法的时间。这段时间,用户会在屏幕上看到这个activity。尽管他可能不是在最顶层显示,也没有和用户进行任何交互。这两个方法之间,你可以保持需要向用户显示的资源。例如:你可以在onStart()方法时注册一个BroadcastReceiver检测某些变化来改变你的界面,当用户看不到这个activity的界面时可以在onStop()里注销这个BroadcastReceiver。这两个方法可以被调用很多次,在可见和对用户隐藏时,作为候补的activity待命。

@ 前台显示周期

一个activity从onResume()方法指导一个onPause()方法称为前台显示周期。此时他在其他的activity之上显示并且与用户交互。一个activity可以频繁的在这两个方法之间过度,例如:当设备休眠或者另一个新的activity启动时,它会进入onPause()状态,当一个activity运行结束或者新的接收到Intent请求时,activity的onResume()会被调用。因此,这两个方法里的代码量会很少

原创粉丝点击