activity生命周期方法调用过程

 

Activity为Android4大组件之一。Activity作为Android的表现层(presentation layer),每个屏幕都是一个Activity(或由Activity继承而来),在Activity中使用View去构建图形化界面来展现信息和对用户的操作进行响应。

      为了保护用户体验和对资源进行管理,需要理解Activity的生命周期。Activity的生命周期不是由Android Application来管理,而是由Android Runtime来管理。Activity的状态由其所在Activity Stack(该栈为后进先出栈)中的位置决定,在栈顶(即最后进栈)的Activity的状态是活动的(Active)。Activity的状态有4种:

  • Active: 当Activity在栈顶时,它是可见的(Visible)、有焦点的(Focused)、在前台的,对用户的操作进行响应。Android会尽可能保持它的Active状态,即使资源不够也会先杀掉栈底的Activity。当其它Activity变为Active时,这个Activity会变为paused状态。
  • Paused: 在某些情况下,Activity还是可见的(Visible),但失去了焦点(如被部分覆盖),虽然看起来它好像是活动的,但它不能对用户的操作进行响应了。Android只有在极端缺资源的情况下才会杀这种状态的Activity。当一个Activity完全被覆盖时,它的状态变为stopped。
  • Stopped: 当Activity完全不可见时(Not Visible),它的状态是停止的,但它仍然停驻在内存中并保持着各UI状态的数据。但当Android缺资源时,它是被杀掉的候选人。因此当状态要转为Stopped时,注意要保存好数据和UI的状态数据。
  • Inactive: 当Activity被杀掉后且没有重启前,它的状态是inactive。这种状态的Activity会被从栈中清除,如果需要再次显示时需要重新启动。

Activity的生命周期:

  • Full Lifetime: 从onCreate到onDestroy。但也有可能因为系统缺资源而在onPause或onStop阶段就把Activity销毁了。
  • Visible Lifetime: 从onStart到onStop。在这个周期里,Activity可见(有可能是部分可见而没有焦点),在全生命周期(Full Lifetime)中可能有多个Visible Lifetime生命周期(如Activity多次从前台转到后台,然后再转回前台),在系统缺乏资源的时候,会出现不调用onStop就直接销毁Activity。
  • Active Lifetime: 从onResume到onPause。在失去焦点时、其它Activity显示时、设备睡眠时,该生命周期都会结束。在调用onPause之前会先调用onSaveInstanceState,以供保存相关数据(如果不在onSaveInstanceState中保存数据,至少要重写onPause来保存数据,同时根据实际情况在onPause中还可能需要关闭Thread、Process、Broadcast Receiver、Service等)

 


activity生命周期方法调用过程_第1张图片

 

public class MyActivityCircle extends Activity {	
		private static final int MENU_QUIT = Menu.FIRST;
    /** 当Activity第一次启动时调用(或被销毁后再次启动时也会被调用) */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.main);
    }
    /** 在不可见后再次可见的开始时调用 */
    protected void onRestart() {
    	super.onRestart();
    }
    /** 在Visible Lifecycle开始时调用 */
    protected void onStart() {
    	super.onStart();
    }
    /** 在onStart()之后调用(但调用是有条件的,不是每次onStart之后都调用) */
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    	super.onRestoreInstanceState(savedInstanceState);
    }
    /** 在onRestoreInstanceState()之后调用,该方法主要是供系统作最后的初始化使用,一般不重写 */
    protected void onPostCreate(Bundle savedInstanceState) {
    	super.onPostCreate(savedInstanceState);
    }
    /** 在Active Lifecycle开始时调用 */
    protected void onResume() {
    	super.onResume();
    }
    /** 在onResume()之后调用,该方法主要是供系统在resume后作最后的构建使用,一般不重写 */
    protected void onPostResume() {
    	super.onPostResume();
    }
    /** 在Active Lifecycle结束时(在onPause()前)调用,用于保存UI状态和数据 */
    protected void onSaveInstanceState(Bundle outState) {
    	super.onSaveInstanceState(outState);
    }
		/** 在Active Lifecycle结束时调用 */
    protected void onPause() {
    	super.onPause();
    }
    /** 在Visible Lifecycle结束时调用 */
    protected void onStop() {
    	super.onStop();
    }
    /** 在Full Lifetime结束时调用 */
    protected void onDestroy() {
    	Log.i(TAG, "onDestroy");
    	textEdit = null;
    	super.onDestroy();
    }
    /** 在Activity退出时调用 */
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    	super.onActivityResult(requestCode, resultCode, data);
    }
    /** 在按MENU键时调用 */
    public boolean onCreateOptionsMenu(Menu menu) {
    	super.onCreateOptionsMenu(menu);
    	menu.add(0, MENU_QUIT, Menu.NONE, "Quit");
    	return true; 
    }
    /** 选Option Menu的菜单项时调用 */
    public boolean onOptionsItemSelected(MenuItem item) {
    	super.onOptionsItemSelected(item);    	
    	switch(item.getItemId()) {
    	case MENU_QUIT:
    		finish();
    		break;
    	}
    	
    	return true;
    }
    /** 创建Activity的对话框时调用 */
    protected Dialog onCreateDialog(int id) {
    	return super.onCreateDialog(id);
    }
    /** 显示Dialog前调用 */
    protected void onPrepareDialog(int id, Dialog dialog) {
        super.onPrepareDialog();
    }
    /** 显示Dialog时调用 */
    public final void showDialog(int id) {
    		super.showDialog();
    }
}

 补充:

  • 大部分情况下,onSaveInstaceState()都会被调用,一个比较常见的不调用该方法的情况是手动按“返回”键。判断是否调用的标准主要是看“是否是系统已经获取到用户的允许”而停止活动,如用户手动按“返回”键、程序中调用finish()等则认为是允许了,而按“Home“键、切换横屏等则是未允许。
  • 而onRestoreInstanceState()则不常见,原因是只有在系统不经用户允许就“暴力”地销毁了Activity(原因主要是系统其它地方需要资源),再次回到这个Activity时会调用(如切换横屏时,系统会先销毁掉原来的Activity,然后再创建新的Activity,此时会调用onRestoreInstanceState)。
  • onSaveInstanceState() 和 onRestoreInstanceState ():
  • 先看Application Fundamentals上的一段话: 
  • Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action (such as pressing the BACK key) 

    从这句话可以知道,当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。 

    注意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。这种可能性有哪些?通过重写一个activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我们可以清楚地知道当某个activity(假定为activity A)显示在当前task的最上层时,其onSaveInstanceState方法会在什么时候被执行,有这么几种情况: 

    1、当用户按下HOME键时。 

    这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则 

    2、长按HOME键,选择运行其他的程序时。 

    3、按下电源按键(关闭屏幕显示)时。 

    4、从activity A中启动一个新的activity时。 

    5、屏幕方向切换时,例如从竖屏切换到横屏时。 

    在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行 

    总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。 

    至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了(不是你主动销毁的),而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行 

    另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原 

各方法调用测试结果如下:

 

1.正常启动时:
onCreate
onStart
onPostCreate
onResume
onPostResume
注意:a.如果启动的activity是因为系统资源不足被系统结束的activity,则会调用onRestoreInstanceState()方法
2.正常启动后按“返回键”返回(相当于关闭了,系统会调用onBackPressed()和finish()):
onBackPressed()
finish()
onPause
onStop
onDestroy
3.从当前activity通过startActivity()启动另一个activity:
当前的activity
onSaveIntanceState()
onPause
新启动的activity
onCreate
onStart
onPostCreate
onReaume
onPostResume
当前的activity
onstop
4.从当前的activity返回(返回键)上一个仍然存在存在的activity
当前的activity
onBackPressed
onfinish
onPause
上一个存在的activity
onRestart
onstart
onResume
onPostResume
当前的activity
onstop
ondestory 
5.用finish结束当前的activity,如果还存在上一个activity
当前的activity
onfinish
onPause
上一个存在的activity
onRestart
onstart
onResume
onPostResume
当前的activity
onstop
ondestory 
6.用finish结束当前的activity,如果不存在上一个activity(当前的activity是第一个启动的)
当前的activity
onfinish
onPause
onstop
ondestory
7.正常启动后按Home键
onSaveInstanceState
onPause
onStop
8.按Home键后再双击应用进入或者长按home键选择该activity
(如果该activity没有被系统因为资源匮乏而销毁时)
onRestart
onStart
onResume
onPostResume
9.正常启动后切换为横屏:
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onPostCreate
onResume
onPostResume
10.屏幕待机(黑掉或者按电源键关闭屏幕)
onPause
11.屏幕变亮
onResume
onPostResume
*******************************************************************

你可能感兴趣的:(android组件)