Activity 生命周期

Android 系统用栈的形式管理 Activity , 当新的 Activity 被创建是, 会被放置到栈顶, 这个 Activity 会进入到运行状态, 而前一个 Activity 则会被压入栈, 直到新的 Activity 退出, 否则不会出现在前台。

单个 Activity 的生命周期状态以及生命周期方法

根据 Android 文档, 每一个 Activity 都有四个状态, 它们分别是:

  • 当 Activity 位于屏幕的最前面(栈顶),称之为 运行(活动)状态: ;
  • 当 Activity 失去焦点, 但是依旧可见, 比如被非全屏的对话框遮住部分, 称之为 暂停状态 , 暂停的 Activity 依然是活动的, 但是当系统内存严重不足时, 有可能被系统结束;
  • 当 Activity 完全不可见时, 称之为 停止状态 , 这时 Activity 依然保持其状态以及成员信息, 不过由于此时 Activity 对用户不可见, 当系统其它地方需要内存时, 经常会被结束;
  • 当 Activity 由不可见变成可见时, 称之为 重启状态 , 这时 Activity 必须迅速恢复它以前的状态。

下图表示 Activity 在这四种状态之间切换的生命周期, 以及状态切换时调用的对应的方法:

Activity 生命周期中的各个方法描述如下:

  • onCreate() 当 Activity 首次创建时调用, 这里通常的工作是创建视图, 绑定数据到列表等。 这个方法还有一个 Bundle 参数, 如果这个 Activity 之前由冻结的状态, 这个状态将包含在里面。 之后, 通常会接着调用 onStart() 方法。
  • onRestart() Activity 已经被停止, 在其被重新开始之前调用。 接下来回调用 onStart() 方法。
  • onStart() 当 Activity 变到用户可见时调用, 接下来如果 Activity 变成不可见的话, 将会调用 onStop() , 否则将调用 onResume() 。
  • onResume() 当 Activity 开始能和用户交互时调用, 此时的 Activity 位于栈顶, 接下来通常会调用 onPause() 。
  • onPause() 当系统准备开始一个新的 Activity 或者重置一个已有的 Activity 时调用。 通常需要在这里进行保存数据、 停止动画以及其它占用 CPU 资源的活动等。 这个方法完成之前, 下一个 Activity 不会继续, 所以这个方法的必须较快的完成。 接下来如果 Activity 又回到栈顶将调用 onResume() , 如果 Activity 变的不可见, 将调用 onStop() 。
  • onStop() 当 Activity 不可见时调用, 如果 Activity 变的可见, 将会调用 onRestart() , 如果 Activity 将销毁, 调用 onDestroy() 。
  • onDestroy() 这是 Activity 被销毁之前最后一次调用, 可能是调用了 Activity 的 finish() 方法, 或者系统要回收资源, 这两者可以通过 isFinishing() 方法进行区别。

多个 Activity 的栈管理方式

多个 Activity 之间采用的是栈道管理方式, 当用户启动新的 Activity 时, 新启动的 Activity 位于栈顶,当用户按后退按钮时, 栈顶的 Activity 被推出栈道并销毁, 如下图所示:

生命周期测试代码

我们在上次创建的程序中添加 Activity 的生命周期代码, 并加入一些输出, 以便清晰的理解:

[Activity(Label = "MyFirstApp", MainLauncher = true)]
public class MainActivity : Activity {public const string ExtraMessage = "Cn.Beginor.MyFirstApp.MainActivity.ExtraMessage";protected override void OnCreate(Bundle bundle) {base.OnCreate(bundle);/** 其它代码省略 **/Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);}protected override void OnStart() {base.OnStart();Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);}protected override void OnResume() {base.OnResume();Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);}protected override void OnPause() {base.OnPause();Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);}protected override void OnStop() {base.OnStop();Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);}protected override void OnRestart() {base.OnRestart();Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);}protected override void OnDestroy() {base.OnDestroy();Android.Util.Log.Debug("Debug", this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name);Android.Util.Log.Debug("Debug", this.GetType().Name + "." + this.IsFinishing);}
}

以上是 MainActivity 添加的生命周期代码, 由于代码完全一直, 就不在贴出来了。 接下来开始调试, 首先会启动 MainActivity , 从输出窗口能看到下面的提示:

MainActivity.OnCreate
MainActivity.OnStart
MainActivity.OnResume

点击“发送”按钮,启动 SecondActivity ,看到下面的提示:

MainActivity.OnPause
SecondActivity.OnCreate
SecondActivity.OnStart
SecondActivity.OnResume
MainActivity.OnStop

点击返回按钮, 返回 MainActivity , 得到的提示如下:

SecondActivity.OnPause
MainActivity.OnRestart
MainActivity.OnStart
MainActivity.OnResume
SecondActivity.OnStop
SecondActivity.OnDestroy
SecondActivity.IsFinishing = True

再次点击“发送”按钮,启动 SecondActivity ,看到下面的提示(与第一次是一致的):

MainActivity.OnPause
SecondActivity.OnCreate
SecondActivity.OnStart
SecondActivity.OnResume
MainActivity.OnStop

这时, 如果点击 Home 按钮, 会得到下面的提示:

SecondActivity.OnPause
SecondActivity.OnStop

点击“最近程序”按钮, 打开 MyFirstApp , 会看到下面的提示:

SecondActivity.OnRestart
SecondActivity.OnStart
SecondActivity.OnResume

如果在 MainActivity 点击“返回”按钮, 应用将会退出, 可以看到下面的提示:

MainActivity.OnPause
MainActivity.OnStop
MainActivity.OnDestroy
MainActivity.IsFinishing = True

至此, 整个生命周期测试完成, 有了上面的测试, 应该可以对 Android 的 Activity 生命周期有一个比较清楚的认识。

张志敏所有文章遵循创作共用版权协议,要求署名、非商业 、保持一致。在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。

本博客已经迁移到 GitHub , 围观地址: http://beginor.github.io/

转载于:https://www.cnblogs.com/CharlesGrant/p/3659783.html

Activity 生命周期及其栈管理方式相关推荐

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

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

  2. Android Activity生命周期管理

    http://blog.csdn.net/thl789/article/details/6628463 本文描述Android中Activity的状态,Activity的状态转换,从而总结了Activ ...

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

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

  4. Android Ams对于Activity生命周期的管理

    分析Activity的生命周期管理,我觉得应该先看下面两篇关于Activity的官方文档: 了解 Activity 生命周期 处理 Activity 状态更改 里面有下面一段话,比较简洁的说出了Act ...

  5. Activity生命周期管理

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

  6. Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)...

    一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Ac ...

  7. Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)...

    一.什么是Activity? 简单的说:Activity或者悬浮于其它窗体上的交互界面. 在一个应用程序中通常由多个Activity构成.都会在Manifest.xml中指定一个主的Activity, ...

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

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

  9. Android doc |Getting Started|部分 转载 --管理Activity生命周期

    原文 https://developer.android.com/training/basics/activity-lifecycle/index.html 原文被部分改动 管理Activity生命周 ...

  10. activity 生命周期_Activity 源码解析

    Android 应用程序启动过程 Activity启动过程可以分为两种:一种是根activity的启动过程,另一种是普通activity启动过程.根activity指的是应用程序启动的第一个activ ...

最新文章

  1. WIN10python3.7配置MaskRCNN环境及demo测试(tensorflow-gpu1.x)
  2. 一招一式攻克linux(四)
  3. 学习笔记(七)——jQuery(一)
  4. 关于 /dev/null 与 /dev/zero
  5. 苹果雪豹操作系统正式版_iOS 12.3.1正式版“意外”推送,iPhone修复诸多问题!...
  6. Java大牛分享的面试知识点
  7. es 删除重复数据_怎么标识并删除SPSS数据库里的“重复个案”?
  8. 限定概率抽奖_LOL:欧皇一次抽奖得16个永久皮肤 把老马亏得坐公交啦
  9. smbinning包:R语言下的分箱处理工具
  10. h3c交换机堆叠(IRF)配置三步完成
  11. 应用商店打开服务器错误,教你应用商店出现错误的修复方法
  12. 在Linux系统部署docsify工具小记
  13. 漂亮好听的蓝牙小音箱,真是郊游好玩伴,Sanag M11体验
  14. Vue + Spring Boot 项目实战(十一):用户角色权限管理模块设计
  15. VS.Net 2005 下载地址
  16. MATLAB中 / 和 \ 的区别
  17. 浅谈测试工程师必备软技能:沟通表达篇
  18. 2.4 货币转换 B
  19. 九阴服务器延迟高怎么解决,6月24日部分互通升级服务器延迟开服公告
  20. Recent Advances in Open Set Recognition: A Survey

热门文章

  1. C#基础知识之读取xlsx文件Excel2007
  2. Android进阶之利用Tablayout+ViewPager+Fragment实现神奇的滑动效果
  3. 常用三大java框架
  4. adguard自定义_搭建AdGuard Home自定义dns,实现全设备拦截广告的目的
  5. CSS:布局——左右两个DIV,左侧宽度固定,右侧占满剩余部分
  6. JavaScript:面向对象简单实例——图书馆
  7. 实战HTML:模拟Mac界面静态实现
  8. 伪随机数生成算法-梅森旋转(Mersenne Twister/MT)
  9. from表单requried属性效果
  10. 论文笔记_S2D.26_2017-ICCV_半监督深度学习的单目深度图预测