`

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的生命周期方法以及如何通过测试日志来...

    Activity生命周期与启动模式

    **Activity生命周期** Activity的生命周期包括了从创建到销毁的各个阶段,主要有以下7个关键状态: 1. **创建(Created)**:当Activity首次被创建时,会调用`onCreate()`方法。在这里,通常进行初始化工作,如...

    Activity生命周期示例

    在Android应用开发中,Activity是用户界面的基本单元,它负责展示...在提供的`Activity_04`文件中,可能包含了演示这些生命周期方法变化的代码示例,通过学习和分析这些示例,开发者可以加深对Activity生命周期的理解。

    Activity生命周期源代码

    Activity的生命周期由一系列的方法组成,这些方法会在特定时刻被系统调用,例如当Activity创建、启动、暂停、恢复或销毁时。通过分析Activity的源代码,我们可以深入理解这些方法的工作原理。 1. **生命周期方法** ...

    activity生命周期

    这是Activity生命周期的第一个回调,通常在这里进行初始化工作,如设置布局、数据绑定等。 2. **启动(Started)**:`onStart()`方法标志着Activity可见但可能不完全在前台。用户可以看到Activity,但不能与其交互...

    2020-实验1-Activity生命周期验证(已完成)1

    实验中,我们通过在每个生命周期方法内添加日志点,可以清晰地观察到不同场景下Activity生命周期的变化: - **全生命周期**:启动时,Activity依次经历onCreate() -> onStart() -> onResume()。当用户按下返回键,...

    Activity生命周期分析

    这是Activity生命周期中的活跃状态。 - `onPause()`:当Activity即将被另一个Activity覆盖,但仍然部分可见时,系统调用`onPause()`。在此方法中,你应该保存临时数据,但不应执行耗时操作,因为它会影响新Activity...

    android activity 生命周期详细介绍

    activity02 onCreate -> activity02 onStart -> activity02 onResume -> activity02 onStop -> activity01 onDestroy`:这个示例展示了当一个Activity启动另一个Activity并完成自身后,Activity生命周期的变化过程。...

    测试Activity生命周期

    在测试Activity生命周期时,开发者通常会在这些关键方法中添加日志语句,以便观察它们的执行顺序和频率。通过这种方式,我们可以确保在正确的地方保存和恢复状态,以及处理其他重要的逻辑,如网络请求、数据库操作等...

    activity生命周期函数

    7. onDestroy():Activity即将被销毁时调用,这是Activity生命周期的最后阶段。在此阶段,可以做彻底的清理工作,例如关闭数据库连接、取消定时任务等。 二、Activity与Fragment的生命周期 Fragment是Android 3.0...

    Activity生命周期完美呈现

    在"Activity生命周期完美呈现"的项目中,开发者可以创建一个简单的Activity,通过Log输出或可视化的方式,展示Activity在不同状态间的转换,这样可以直观地看到每个生命周期方法的调用顺序,加深理解。 总之,理解...

    Android Activity生命周期

    Android Activity 生命周期是指 Activity 从创建到销毁的整个过程,该过程中会经历多个状态变化,每个状态变化都会触发相应的回调方法。理解 Activity 生命周期是 Android 开发的基础。 在 Android 中,Activity ...

    测试Android Activity生命周期Demo

    这是Activity生命周期中的最后一个方法,开发者可以在这里释放资源,解除监听器,进行最后的清理工作。 在“TestLifeActivity”这个测试项目中,开发者可能创建了一个Activity,其中覆盖了上述所有生命周期方法,并...

    android Activity生命周期详解(图文)

    总之,深入理解Activity生命周期和其背后的源码逻辑,对于编写高效、响应迅速且用户体验优秀的Android应用至关重要。开发者应熟练掌握这些知识点,以便在设计和调试应用时能得心应手。通过实践和分析ActivityDemo,...

    Android的生命周期调用顺序

    本文将深入探讨Android的生命周期调用顺序,并通过实际的Demo来帮助理解。 首先,当用户启动一个Activity时,系统会调用`onCreate()`方法。在这个方法中,开发者通常会初始化界面布局、设置基本属性以及进行其他...

    Activity生命周期总结

    本文将详细介绍 Activity 生命周期中的各个方法及其触发条件,并通过示例代码进行说明。 #### Activity 生命周期概述 一个 Activity 代表了用户的一个交互界面,它由一系列回调方法组成,这些方法定义了 Activity ...

    Android activity生命周期示例

    本示例项目“Android activity生命周期示例”旨在帮助开发者深入理解Activity的生命周期及其各个阶段,这对于优化用户体验和资源管理至关重要。 Activity的生命周期包括以下几个主要状态: 1. **创建(Created)**...

    Activity生命周期demo

    谷歌官方提供的Activity生命周期示例("Activity lifecycle demo")是一个实用的教学工具,帮助开发者直观地理解Activity在不同情况下的状态变化。 这个demo最初是基于Eclipse开发的,但已经转化为更适合现代开发...

    android Activity生命周期

    一、Activity生命周期概述 Activity的生命周期由创建、启动、运行、暂停、停止和销毁这6个状态构成。每个状态的变化都会触发特定的方法回调,开发者可以重写这些方法以执行相应的操作。 1. 创建(Creation): - `...

    Activity生命周期Demo

    在深入探讨Activity生命周期之前,我们先理解一下Activity的基本概念。Activity代表一个可视化的用户界面,它可以是手机屏幕上的一个完整窗口,也可以是多个窗口的一部分。在用户与应用的交互过程中,Activity会经历...

Global site tag (gtag.js) - Google Analytics