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