hilight

敏捷开发、持续交付、虚拟化、分布式

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在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个阶段如下: 
1.  开始Activity:在这个阶段依次执行3个生命周期方法:onCreate、onStart和onResume。 
2.  Activity失去焦点:如果在Activity获得焦点的情况下进入其他的Activity或应用程序,这时当前的Activity会失去焦点。在这一阶段,会依次执行onPause和onStop方法。 
3.  Activity重新获得焦点:如果Activity重新获得焦点,会依次执行 3个生命周期方法:onRestart、onStart和onResume。 
4.  关闭Activity:当Activity被关闭时系统会依次执行3个生命周期方法:onPause、onStop和onDestroy。


一个Activity总的来说拥有四种状态,分别是

       1)激活(运行)状态:  此时它一定是在屏幕的最前端的,对应Activity栈来说,它是在栈顶的;

       2)暂停状态:此时它在屏幕上仍然是可见的,但是失去了焦点。这种情况会发生在当有一个不会占满整个屏幕或者拥有透明属性的Activity启动并获得了屏幕焦点时。一个暂停状态的Activity还是存活的(alive),它仍然维持着自己的各个内部状态和成员信息,仍然和window manager保持连接,但是系统可能会在手机内存极低的情况下杀掉该Activity;

       3)终止状态:此时这个Activity在屏幕上完全不可见,它已经被其他的Activity挡住了。这时它维持着自己的各个内部状态和成员信息,但是由于用户已完全看不见它,其window也会被隐藏掉,也就是说window manager不再管理其window信息了。停止状态下的Activity会经常由于手机的内存征用问题被系统杀掉。

       4)当Activity被暂停或者终止时,系统可以把它从内存中清除,这个过程也许会提示用户是否要结束该Activity,也许只会简单地杀掉其进程。当这个Activity重新被用户调出来显示在界面上时,用户自己必须保证Activity能够完全恢复先前维护的内部状态信息,以使其回到Activity内部所处先前的状态,这种情况如果处理不好很容易出现问题。

 

如果在这4个阶段执行生命周期方法的过程中不发生状态的改变,那么系统会按着上面的描述依次执行这4个阶段中的生命周期方法,但如果在执行的过程中改变了状态,系统会按着更复杂的方式调用生命周期方法。 在执行的过程中可以改变系统的执行轨迹的生命周期方法是onPause和onStop。如果在执行onPause方法的过程中Activity重新获得了焦点,然后又失去了焦点。系统将不会再执行onStop方法,而是按着如下的顺序执行相应的生命周期方法: 
onPause -> onResume-> onPause 
    如果在执行onStop方法的过程中Activity重新获得了焦点,然后又失去了焦点。系统将不会执行onDestroy方法,而是按着如下的顺序执行相应的生命周期方法: 
onStop -> onRestart -> onStart -> onResume -> onPause -> onStop 

从图1所示的Activity生命周期不难看出,在这个图中包含了两层循环,第一层循环是onPause-> onResume -> onPause,第二层循环是onStop -> onRestart -> onStart -> onResume -> onPause-> onStop。我们可以将这两层循环看成是整合Activity生命周期中的子生命周期。第一层循环称为焦点生命周期,第二层循环称为可视生命周期。也就是说,第一层循环在Activity焦点的获得与失去的过程中循环,在这一过程中,Activity始终是可见的。而第二层循环是在Activity可见与不可见的过程中循环,在这个过程中伴随着Activity的焦点的获得与失去。也就是说,Activity首先会被显示,然后会获得焦点,接着失去焦点,最后由于弹出其他的Activity,使当前的Activity变成不可见。因此,Activity有如下3种生命周期:
1.  整体生命周期:onCreate -> ... ... -> onDestroy。 
2.  可视生命周期:onStop -> ... ... -> onPause。 
3.  焦点生命周期:onPause -> onResume。 
    注意:在图1所示的Activity生命周期里可以看出,系统在终止应用程序进程时会调用onPause、onStop和onDesktroy方法。而onPause方法排在了最前面,也就是说,Activity在失去焦点时就可能被终止进程,而onStop和onDestroy方法可能没有机会执行。因此,应该在onPause方法中保存当前Activity状态,这样才能保证在任何时候终止进程时都可以执行保存Activity状态的代码。

======================================================================

记忆图片如下:

onCreate创建与onDestroy销毁;

onStart可见与onStop不可见;

onResume可编辑(即焦点)与onPause;

这6个方法是相对应的,那么就只剩下一个onRestart方法了,这个方法在什么时候调用呢?答案就是:在Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法;如果被onDestroy了,则是调用onCreate方法。

======================================================================

看看文档吧

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



posted on 2012-04-05 23:12  andy0805  阅读(488)  评论(0编辑  收藏  举报