`

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等)

 


 

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
*******************************************************************
  • 大小: 37.1 KB
分享到:
评论

相关推荐

    acitvity生命周期方法调用顺序与测试日志

    activity生命周期调用顺序工程与测试日志

    activity 生命周期 demo

    activity 生命周期 demo 查看调用方法

    Android中的Activity生命周期总结

    Activity生命周期一般分为四个基本状态,分别是活动状态(running),暂停状态(paused),停止状态(stopped)和死亡状态。 1.活动状态(running) 活动状态一般是指该Activity正处于屏幕最显著的位置上显示,即该Activity...

    android下activity生命周期

    android下activity生命周期 生命周期: 回调 描述 onCreate() 这是第一个回调,在活动第一次创建是调用 onStart() 这个回调在活动为用户可见时被调用 onResume() 这个回调在应用程序与用户开始可交互的时候调用 ...

    Android_Activity_生命周期例子

    Android_Activity_生命周期例子.主要通过几个activity 相互调用 解释生命周期,应该对大家了解android activity 的生命周期有所帮助

    实验一Android环境构建与Activity生命周期(1).doc

    实验一Android环境构建与Activity生命周期 一、 实验内容: 1、页面要求:主页面三个按钮。 2、功能要求:点击按钮分别调用:内部的Activity、自定义的Activity、结束当前 的Activity。 二、实验要求: 1. 利用几个...

    实验一Android环境构建与Activity生命周期.doc

    添加Log日志,通过Log日志验证Activity生命周期中的7个方法执行过程; 4. 了解项目的基本文件目录结构,了解Activity周期中的4种状态。 【过程】 (1)建立新项目,实现Hello World; 1)打开Eclipse,选择File -> ...

    android activity的生命周期小例子

    三个activity之间进行切换,看看activity是怎么运行的,在后台打印activity的调用方法

    Android实验二:Activity的生命周期及Intent

    1、设计界面,包括四个按钮,两个文本框。单击对应按钮可以启动对应...假定Activity A为启动Activity。 2、修改 Activity 的启动模式 LaunchMode,并通过 Log 信息来体会不同启动模式所对应的Activity 和 task 的关系

    将Activity的生命周期打印出来

    对手机进行操作,例如锁屏 亮屏 解锁的 长按POWER键时会调用相关的回调函数,并打印到一个文本中,文本是保存到手机中

    Android编程之基于Log演示一个activity生命周期实例详解

    主要介绍了Android编程之基于Log演示一个activity生命周期,结合完整实例形式较为详细的分析总结了Log演示activity生命周期的具体用法及Log的具体使用方法,需要的朋友可以参考下

    Activity生命周期实例讲解

    Activity中有7个与生命周期有关的函数。其中onCreated()是activity第一次被启动时执行的,主要是初始化一些变量,onRestart()是当前activity重新被启动时调用的;绑定一些监听器等;onStart()是activity界面被显示...

    android生命周期管理:暂停和恢复Activity

    android生命周期管理:暂停和恢复Activity

    Android中Activity生命周期和启动模式详解

    主要介绍了Activity生命周期和启动模式详解的相关资料,需要的朋友可以参考下

    ajiexw#Ajiex.com#Activity的生命周期1

    1.Activity在onStart方法调用后,就处于可见状态了(visible) 2.当经过onPause方法后处于暂停状态(Paused),这时Activi

    android安卓横竖屏切换效果、webview加载以及生命周期监测

    android studio中 activity的当前页横竖屏切换、跳转页面后横竖屏切换以及生命周期的调用

    Android Activity的生命周期详细介绍

    生命周期描述的是一个类从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法。在这个过程中,会针对不同的生命阶段调用不同的的方法。  Activity是Android中四大组件之一,是最常见的应用组件,也是用的最多...

    android基础总结篇之一:Activity生命周期

    近来回顾了一下关于Activity的生命周期,参看了相关书籍和官方文档,也有了不小的收获,对于以前的认知有了很大程度上的改善,在这里和大家分享一下。 熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己...

    Android中Fragment与Activity的生命周期对比

    Fragment必须是依存于Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了俩者的关系: 可以看到Fragment比Activity多了几个额外的生命周期回调函数: onAttach...

    Android基础之Activity生命周期

    近来回顾了一下关于Activity的生命周期,参看了相关书籍和官方文档,也有了不小的收获,对于以前的认知有了很大程度上的改善,在这里和大家分享一下。 熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己的...

Global site tag (gtag.js) - Google Analytics