您的位置:首页 > 移动开发 > Android开发

Android - Activity的生命周期

2015-10-10 16:10 465 查看
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在完整的、可见的和活动的生存期之间转化时,他们就会被触发。



package com.niangcool.feel;

import android.app.Activity;
import android.os.Bundle;

/**
* @Title: MyStatuChangeActivity.java
* @Package com.niangcool.feel
* @Description: TODO
* @author Brant Liu  lbf1988@qq.com
* @date 2015-10-10 下午3:41:18
* @version V1.0
*/
public class MyStatuChangeActivity extends Activity{
/**
* 在完整生命周期开始时调用
* */
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
/**
* 在onCreate方法完成后调用,用于恢复UI状态
* */
@Override
public void onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
//从savedInstanceState恢复UI状态
//这个bundle也被传递给了onCreate
//自Activity上次可见之后,只有当系统终止了该Activity时,才会被调用

//在随后的Activity进程的onRestart可见生存期之前调用
}

@Override
public void onRestart(){
super.onRestart();
//加装载改变,知道Activity在此进程中已经可见
}

/**
* 在可见生存期的开始时调用
* */
@Override
public void onStart(){
super.onStart();
//既然Activity可见,就应用任何要求的UI Change
}
/**
* 在Activity状态生存期开始时调用
* */
@Override
public void onResume(){
super.onResume();
//恢复Activity需要,但是当它处于不活动状态时被挂起的暂停的UI更新、线程或进程
//在Activity状态生命周期结束的时候调用,用来保存UI状态的改变
}

/**
* 把UI状态改变保存到saveInstanceState
* */
@Override
public void onSaveInstanceState(Bundle savedInstanceState){
//如果进程被运行时终止并被重启,那么这个Bundle将被传递给onCreate和onRestoreInstanceState
super.onSaveInstanceState(savedInstanceState);
}

/**
* 在Activity状态生存期结束时调用
* */
@Override
public void onPause(){
//挂起不需要更新的UI更新、线程或者CPU密集的进程
//当Activity不是前台的活动状态的Activity时
super.onPause();
}

/**
* 在可见生存期结束时调用
* */
@Override
public void onStop(){
//挂起不需要的UI更新、线程或处理,当Activity不可见时,保存所有的编辑或者状态改变,因为在调用这个方法后,进程可能会被终止
super.onStop();
}
/**
* 在完整生存期结束时调用
* */
@Override
public void onDestroy(){
//清理所有的资源,包括结束线程、关闭数据库连接等
super.onDestroy();
}
}


  在一个Activity从创建到销毁的完整的生命周期内,它会经理活动生存期和可见生存期的一次或者多次重复。每一次转化都会触发前面所描述的方法处理程序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: