Android - Activity的生命周期

1.Activity栈

  每一个Activity的状态是由它在Activity栈中所处的位置所决定的,Activity栈是当前所有正在运行的Activity的后进先出的集合。当一个新的Activity启动时,它就变为Activity状态,并被移动到栈顶。如果用户使用back按钮返回到了刚才的Activity,或者前台Activity被关闭了,那么栈中的下一个Activity就会移动到栈顶,变为活动状态。

  

(Android - 应用程序的优先级和进程状态)应用程序的优先级受其最高优先级的Activity的影响。当Android的内存管理器决定终止哪个应用程序来释放资源时,它会使用这个栈来决定应用程序的优先级.

2.Activity的状态

  随着Activity的创建和销毁,他们会按照上图那样,从栈中移进移出。在这个过程中,他们也经历了4中可能的状态(活动状态、暂停状态、停止状态、非活动状态)

  1)活动状态:当一个Activity位于栈顶的时候,它是可见的、具有焦点的前台Activity,这时它可以接收用户输入。Android将会不惜一切代价来保持它处于活动状态,并根据需要来销毁栈下面部门的Activity,以保证这个Activity拥有它所需要的资源。当另一个Activity变为活动状态时,这个Activity就将被暂停。

  2)暂停状态:在某些情况下,Activity是可见的,但是没有获得焦点,此时它就处于暂停状态。当一个透明的或者非全屏的Activity位于该Activity之前时,就会达到这个状态。当Activity被暂停的时候,它仍然会被当作近似活动状态的状态,但是它不能接收用户的输入事件。在极端情况下,Android会终止暂停的Activity,以便为活动状态的Activity释放资源。当一个Activity变得完全不可见的时候,它就会变为停止状态。

  3)停止状态:当一个Activity不可见的时候,它就处于停止状态。此时,Activity仍然会停留在内存中,保存所有的状态信息,然而当系统的其它地方要求使用内存的时候,它们就会成为被终止的首要候选对象。在一个Activity停止的时候,保存数据和当前的UI状态以及停止任何非关键操作时很重要的。一旦一个Activity被退出或者关闭,它就会变为飞活动的状态

  4)非活动状态:当一个Activity被终止之后,在启动之前它就处于非活动状态。处于非活动状态的Activity已经从Activity栈中移除了,因此,在它们可以被显示和使用之前,需要被重新启动。

注:状态转化是非确定性的,完全由Android内存管理器处理。Android首先会关闭包含非活动状态的Activity的应用程序,接着会关闭那些停止的应用程序。只有在极端情况下,它才会移除那些被暂停的应用程序。

3.监控状态改变

  为了保证Activity可以对状态改变作出反应,Android提供了一些列时间 处理程序,当Activity在完整的、可见的和活动的生存期之间转化时,他们就会被触发。

 

 1 package com.niangcool.feel;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 
 6 /**
 7  * @Title: MyStatuChangeActivity.java 
 8  * @Package com.niangcool.feel 
 9  * @Description: TODO
10  * @author Brant Liu  lbf1988@qq.com
11  * @date 2015-10-10 下午3:41:18 
12  * @version V1.0 
13  */
14 public class MyStatuChangeActivity extends Activity{
15     /**
16      * 在完整生命周期开始时调用
17      * */
18     @Override
19     public void onCreate(Bundle savedInstanceState){
20         super.onCreate(savedInstanceState);
21     }
22     /**
23      * 在onCreate方法完成后调用,用于恢复UI状态
24      * */
25     @Override
26     public void onRestoreInstanceState(Bundle savedInstanceState){
27         super.onRestoreInstanceState(savedInstanceState);
28         //从savedInstanceState恢复UI状态
29         //这个bundle也被传递给了onCreate
30         //自Activity上次可见之后,只有当系统终止了该Activity时,才会被调用
31         
32         //在随后的Activity进程的onRestart可见生存期之前调用
33     }
34     
35     @Override
36     public void onRestart(){
37         super.onRestart();
38         //加装载改变,知道Activity在此进程中已经可见
39     }
40     
41     /**
42      * 在可见生存期的开始时调用
43      * */
44     @Override
45     public void onStart(){
46         super.onStart();
47         //既然Activity可见,就应用任何要求的UI Change
48     }
49     /**
50      * 在Activity状态生存期开始时调用
51      * */
52     @Override
53     public void onResume(){
54         super.onResume();
55         //恢复Activity需要,但是当它处于不活动状态时被挂起的暂停的UI更新、线程或进程
56         //在Activity状态生命周期结束的时候调用,用来保存UI状态的改变
57     }
58     
59     /**
60      * 把UI状态改变保存到saveInstanceState
61      * */
62     @Override
63     public void onSaveInstanceState(Bundle savedInstanceState){
64         //如果进程被运行时终止并被重启,那么这个Bundle将被传递给onCreate和onRestoreInstanceState
65         super.onSaveInstanceState(savedInstanceState);
66     }
67     
68     /**
69      * 在Activity状态生存期结束时调用
70      * */
71     @Override
72     public void onPause(){
73         //挂起不需要更新的UI更新、线程或者CPU密集的进程
74         //当Activity不是前台的活动状态的Activity时
75         super.onPause();
76     }
77     
78     /**
79      * 在可见生存期结束时调用
80      * */
81     @Override
82     public void onStop(){
83         //挂起不需要的UI更新、线程或处理,当Activity不可见时,保存所有的编辑或者状态改变,因为在调用这个方法后,进程可能会被终止
84         super.onStop();
85     }
86     /**
87      * 在完整生存期结束时调用
88      * */
89     @Override
90     public void onDestroy(){
91         //清理所有的资源,包括结束线程、关闭数据库连接等
92         super.onDestroy();
93     }
94 }

 

  在一个Activity从创建到销毁的完整的生命周期内,它会经理活动生存期和可见生存期的一次或者多次重复。每一次转化都会触发前面所描述的方法处理程序。

 

posted @ 2015-10-10 16:10  偷着乐  阅读(215)  评论(0编辑  收藏  举报