http://blog.csdn.net/thl789/article/details/6628463

本文描述Android中Activity的状态,Activity的状态转换,从而总结了Activity各个生命周期的典型时序。与Android现有框架结合,充分考虑Activity的各个生命周期阶段,应用开发者实现相应的回调接口,只有这样,才能开发出符合框架规范的程序。

Activity状态

Activity在Android系统中用一个LIFO机制的Activity栈来管理。当新的Activity[A]启动时,它就被放在了Activity栈的顶端,而进入运行状态,而先前运行的Activity[B]通常就被放在了Activity栈里A的下面。当A退出运行而从Activity栈顶出栈之后,B就成了Activty栈的最上面的Activity,可再次进入前台运行状态。

Activity有三种状态:(参考源文档,这里指的是可以保持的状态,states can be static)

Ø RESUMED当Activity在屏幕前台运行时(位于当前任务堆栈的顶部),此时该Activity获得了用户的输入焦点。 这个状态也叫Active或Running状态。

Ø PAUSED当它失去焦点但仍然对用户可见时,它处于暂停状态。此时,在它之上有另外一个Activity。这个Activity也许是透明的,或者未能完全遮蔽全屏,所以被暂停的Activity仍对用户可见。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并连接至窗口管理器)。但当系统处于极低内存的情况下,仍然可以杀死这个Activity。

Ø STOPPED 如果它完全被另一个Activity覆盖是,它处于停止状态。它仍然保留所有的状态和成员信息。然而它不在为用户可见,所以它的窗口将被隐藏。如果其它地方需要内存,则系统经常会杀死这个Activity。

处于PAUSED或STOPPED状态的Activity,可以被移除出内存,移除的先后顺序是先STOPPED状态的,后PAUSED状态的。一般PAUSED状态的Activity也只是在资源极端不足的情况下,它所运行的进程才会被杀掉。是否要移除出内存,还要看它所运行的进程具体状况,具体规则和操作,可参阅[5]。

As you'll learn in the following lessons, there are several situations in which an activity transitions between different states that are illustrated in figure 1. However, only three of these states can be static. That is, the activity can exist in one of only three states for an extended period of time:

Resumed
In this state, the activity is in the foreground and the user can interact with it. (Also sometimes referred to as the "running" state.)
Paused
In this state, the activity is partially obscured by another activity—the other activity that's in the foreground is semi-transparent or doesn't cover the entire screen. The paused activity does not receive user input and cannot execute any code.
Stopped
In this state, the activity is completely hidden and not visible to the user; it is considered to be in the background. While stopped, the activity instance and all its state information such as member variables is retained, but it cannot execute any code.

生命周期转换图

下图是根据Android官方提供的Activity状态转换图经过笔者少许更改之后的图。(注意图中,方框内执行的是状态转换的过程,并不是状态,状态如前述,只有三种:RUNNING / PAUSED / STOPPED。在很多文章的描述中,连这点基本的概念都没搞清楚!)

(现在可以不理解,但是读完全文,一定要把这张图刻到脑子里!)

在上图中,可以从三个阶段关注Activity的生命周期

Ø  整个的生命周期,指的是onCreate(Bundle)和onDestroy()之间过程。Activity在onCreate()设置所有的“全局”状态,在onDestroy()释放所有的资源。

Ø 可见的生命周期,指的是onStart()和onStop()之间的过程。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。

Ø 前台的生命周期,指的是onResume()和onPause()之间的过程。在这段时间里,该Activity处于所有 Activity的最上面,获得了用户焦点。Activity可以经常性地在RESUMED和PAUSED状态之间切换,所以在这些接口方法中的代码应该属于非常轻量级的,避免低效的转换而让用户有等待的感觉。

由此,我们可以得出下面几个典型的场景

1)   Activity从被装载到运行。则执行顺序为:onCreate() -> onStart()-> onResume();

这是个典型过程,发生在Activity被系统装载运行时。

2)   Activity从运行到暂停,再到继续回到运行。执行顺序为:onPause() -> onResume();

这个过程发生在Activity被别的Activity遮住了部分UI,失去了用户焦点,另外那个Activity退出之后,这个Activity再次重新获得运行。这个过程中该Activity的实例是一直存在。

3)   Activity从运行到停止。执行顺序为:onPause() -> onStop() ;

这个过程发生在Activity的UI完全被别的Activity遮住了,当然也失去了用户焦点。这个过程中Activity的实例仍然存在。比如,当Activity正在运行时,按HOME键,该Activity就会被执行这个过程。

4)   Activity从停止到运行。执行顺序为:onRestart()-> onStart()-> onResume();

处于STOPPED状态并且实例仍然存在的Activity,再次被系统运行时,执行这个过程。这个过程是3的逆过程,只是要先执行onRestart()而重新获得执行。

5)   Activity从运行到销毁。执行顺序为:onPause() -> onStop() -> onDestroy();

这个过程发生在Activity完全停掉并被销毁了,所以该Activity的实例也就不存在了。比如,当Activity正在运行时,按BACK键,该Activity就会被执行这个过程。这个过程可看作是1的逆过程。

6)   被清除出内存的Activity重新运行。执行顺序为:onCreate() -> onStart()-> onResume();

这个过程对用户是透明的,用户并不会知道这个过程的发生,看起来如同1的执行顺序,不同的是如果保存有系统被清除出内出时的信息,会在调用onCreate()时,系统以参数的形式给出,而1中onCreate()的参数为null。

管理Activity生命周期

这里说是管理Activity的生命周期,更确切的说应该是参与生命周期的管理,因为Android系统框架已经很好的管理了这其中的绝大部分,应用开发者要做的就是在Android的框架下,在Activity状态转换的各个时点上,做出自己的实现,而实现这些要做的只是在你的Activity子类里面Override这些Activity的方法即可。

下图是Activity生命周期相关的方法。

Activity的实例化与启动

Activity实例化是由Android系统完成,在用户点击执行一个Activity或者另一个Activity需要这个Activity执行的时候,如果该Activity的实例不存在,Android系统都会实例化之,并在该Activity所在进程的主线程中调用该Activity的onCreate()方法,实现Activity实例化时的工作。

所以,Activity::onCreate()是系统实例化Activity时,Activity可做的自身初始化的时机。在这里可以实例化变量,调用Activity::setContentView()设置UI显示内容。

一般的,Activity实例化之后,就要启动该Activity,这样会在该Activity所在进程的主线程中顺序调用Activity的onStart(), onResume()。回头看图一Activity的生命周期的典型时序,一般onStart()在所有的时序中都不是很特别的过程,所以一般不怎么实现。onResume()在暂停继续流程中很重要,后文再讲。

下图就是Activity实例化与启动的时序

这里从应用开发者角度来说明问题,暂不考虑Android内部的实现细节,所以各种动作的发起者统一用AndroidSystem来说明,而从Activity这边看过去,所有这些操作也都是异步的。

注意

onCreate()在Activity存续期内,只会被调用一次。如生命周期图中的时序6的情形其实是另外又启动了一个Activity的实例,并通过onCreate()的参数传递进先前杀掉的Activtiy里保留的信息。

onStart()可因为已经STOPPED了,再次执行而被调用多次。

onResume()可因为Activity的PAUSED/RESUMED的不停转换,而被频繁调用。

Activity的暂停与继续

Activity因为被别的Activity遮住部分UI,并失去焦点而被打断暂停,典型的情况发生在系统进入睡眠或被一个对话框打断的情况。而在被暂停之前,系统会通过onPause()让Activity有保留被暂停前状态的时机。Activity可以在onPause()中,保存所做的修改到永久存储区,停止动画显示,等。onPause()里的操作必须简短并快速返回,因为在onPause()返回之前不会调入其他的Activity运行。

此时Activity因为还有部分UI显示,它通常与Window Manager的链接还在,所以一般UI的修改不需保留。即便在极端的情况下,PAUSED的Activity所在的进程被杀死,那也是极端情况,那种情况下,不可能使Activity的UI显示完整一致。

系统在被唤醒或者打断它的对话框消失之后,会继续运行,此时系统会调用Activity的onResume()方法。在onResume()方法中可以做与onPause()中相对应的事情。

下图是,一个Activity启动同一个进程内另外一个Activity的时序图。它能很好的说明,一个Activity启动时,与另外一个Activity之间的各种PAUSE/RESUME交互过程。

不过千万记得,PAUSE/RESUME是众多Activity状态转换中的一个子集,很多其他的场景也是要走这个过程的。

Activity的关闭/销毁与重新运行

Activity被STOP可能是完全被别的Activity覆盖掉了,也可能是用户显式的按了BACK或HOME键。Activity被Stop之前,它的onStop()方法会被提前调用,来做些Stop前的处理。如果处于STOPPED的Activity再次运行,它的onRestart()方法会被调用,这是区分其他调用场景,比较合适的实现处理的地方。

注意,因为处于PAUSED状态的Activity在内存极端不足的情况下,它所在的进程也可能被杀掉,这样onStop()在被杀掉前,不一定会被调用,所以onPause()是比onStop()更合适的保留信息到永久存储区的时机。

Activity被销毁可能是显式的按了BACK键,也可能是处于PAUSED或STOPPED状态,因为内存不足而被杀掉的。还有种情况是配置信息改变(比如屏的方向改变)之后,根据设置需要杀掉所有的Activity(是否关闭还要看Activity自己的配置),再重新运行他们。

被系统隐式杀死的Activity,在被杀死(onStop()调用)之前,一般的会调用onSaveInstanceState()保留该Activity此时的状态信息。该方法中传入Bundle参数,可在此方法中把此时的状态信息写入,系统保留这这些系统。而当该Activty再次被实例化运行时,系统会把保留在Bundler的信息再次以参数形式,通过onCreate()方法传入。

一般,onSaveInstanceState()中保留UI的信息,永久存储的信息最好还是在onPause()中保存。Activity的onSaveInstanceState()已经缺省实现来保留通用View的UI信息,所以不管你保留与否当前Activity的信息,通常都要在onSaveInstanceState()先调用一下super.onSaveInstanceState()保留通用的UI信息。

参考资料及进一步阅读

[1] DeveloperGuide Framework Topics – Activities http://developer.android.com/guide/topics/fundamentals/activities.html

[2] ActivityReference http://developer.android.com/reference/android/app/Activity.html

[3] Activitysources Activity.java

[4] Intentand Intent filters http://developer.android.com/guide/topics/intents/intents-filters.html

[5] Processesand Threads http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html

Android Activity生命周期管理相关推荐

  1. Android Activity 生命周期详解及监听

    前言 系列文章: Android Activity 与View 的互动思考 Android Activity 生命周期详解及监听 Android onSaveInstanceState/onResto ...

  2. Android activity 生命周期(一)

    Android activity 生命周期(一) 转载请注明出处:http://blog.csdn.net/chenlinfeng772885775/article/details/53672919 ...

  3. Android 插件化原理解析——Activity生命周期管理

    之前的 Android插件化原理解析 系列文章揭开了Hook机制的神秘面纱,现在我们手握倚天屠龙,那么如何通过这种技术完成插件化方案呢?具体来说,插件中的Activity,Service等组件如何在A ...

  4. Android apk动态加载机制的研究(二):资源加载和activity生命周期管理

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了 ...

  5. android 生命周期管理,Android Activity生命周期和堆栈管理的详解_Android_脚本之家...

    Activity的生命周期 Activity是Android中的四大组件之一,也是最基本,最重要的组件,是android系统提供一个可视化的,能与用户交换的组件. 系统提供的组件,不需要用户实例化,用 ...

  6. android gilde生命周期管理,Glide原理之Activity、Fragment生命周期监听(三)

    Glide中一个重要特性是Request可以随Activity或Fragment的onStart而resume,onStop而pause,onDestroy而clear,从而节约流量和内存,并且防止内 ...

  7. Android RxJava生命周期管理解决方案整理

    一.为什么要做生命周期管理? Observable.create(new ObservableOnSubscribe<String>() {@Overridepublic void sub ...

  8. Android Activity生命周期★

    1.Activity Activity由Activity栈管理.启动一个新的Activity后,此Activity将被加入到Activity栈顶,之前的Activity位于此Activity底部. A ...

  9. Activity生命周期管理

    之前的 Android插件化原理解析 系列文章揭开了Hook机制的神秘面纱,现在我们手握倚天屠龙,那么如何通过这种技术完成插件化方案呢?具体来说,插件中的Activity,Service等组件如何在A ...

最新文章

  1. 华为鸿蒙新概念机,华为P50概念机确认,麒麟芯片+鸿蒙系统,这才是真旗舰!...
  2. Swift来了,是不是可以入手IOS开发了?
  3. 基于依赖统计的方法——TPDA
  4. Android内容提供者(群发短信)
  5. mysql glibc包很大_linux 安装 mysql 的 glibc 包
  6. 内大考研计算机专业课,2019计算机考研专业课核心考点梳理
  7. 贾俊平统计学思维导图- 第十三章 时间序列分析和预测
  8. spring 项目中设置maven镜像源
  9. Android基础:ViewPage
  10. 计算机领域的顶会、顶刊
  11. JavaMail实现发送邮件程序
  12. Map的取值方式详解
  13. 用 kali 工具 apache 搭建简易网站 LAMP
  14. 20140723曙光-测试开发工程师-实习面试
  15. 【技巧】修改windows10在高分屏下的应用的dpi
  16. 参加全国大学生智能汽车竞赛,快来申请沁恒RISC-V MCU!
  17. 国内外著名个人防火墙集锦
  18. 【物联网开发平台MQTT快速接入使用】
  19. 从零开始用人工智能预测股票(一、特征选取)
  20. Mobile Debian on mobile devices

热门文章

  1. 使用163邮箱发送邮件、HTML、附件、图片
  2. java赵云主角兵器谱游戏_赵云赵子龙的外号有哪些?赵云的武器是什么 赵
  3. android 项目导入另一个Android项目作为子模块调用
  4. 自动化测试工程师面试简历参考
  5. android camera 全屏,Android Camera做全屏预览之最简单方法.doc
  6. 克里奥服务器装系统,克里奥神模拟器
  7. 2021年全球探针卡收入大约2506.3百万美元,预计2028年达到3823.8百万美元,2022至2028期间,年复合增长率CAGR为 6.2%
  8. python聊天小程序支持私聊和多人_Python实现多人在线匿名聊天的小程序
  9. SpringBoot-Mongodb双数据源配置
  10. 共享文件夹无法打开——服务器存储空间不足,无法处理此命令