本系列文章,参考《第一行代码》,作为个人笔记

更多内容:更多精品文章分类

本系列持续更新中….

2.4 Activity 的生命周期

掌握 Activity 的生命周期对于开发者来说是非常重要的!

2.4.1 返回栈

Android 中的 Activity 是可以层叠的。我们每次启动一个新的 Activity,就会覆盖在原来的 Activity 上面,然后点击 back 键就会销毁最上面的 Activity,下面的 Activity 就会重新显示出来。

Android 使用任务(Task)来管理 Activity 的,一个任务(Task)就是一组存放在栈中的 Activity 的集合。这个栈也被称为返回栈(Back Task)。

栈是一种后进先出的数据结构,默认情况下,每当我们启动一个新的 Activity,这个 Activity 就会在返回栈中入栈,并且处于栈顶的位置。每当我们按下 Back 键或者调用 finish 方法后就会销毁一个 Activity。处于栈顶的Activity 就会出栈,这是前一个入栈的 Activity 就会重新处于栈顶的位置。系统总是会显示处于栈顶的 Activity 给用户。

2.4.2 Activity 状态

每个 Activity 在其生命周期中最多有 4 种状态。

1.运行状态

当一个 Activity 处于返回栈的栈顶的时候,这个时候的 Activity 就是运行状态。系统是最不愿意回收这种状态的 Activity 的。

2.暂停状态

当一个 Activity 不处于栈顶状态但是仍然可见的时候,这种状态称为暂停状态。不处于栈顶仍然可见是因为很多 Activity 不一定是占满全屏的,比如对话框形式的 Activity。这种状态的 Activity 系统也是不愿意回收的,除非内存极低的情况。

3.停止状态

当 Activity 不处于栈顶状态并且不可见的时候,这种状态称为停止状态。这种状态下系统仍然会保留 Activity 的相应状态和变量。但是当内存不太足,也是可能会被回收的。

4.销毁状态

Activity 从栈中移除,这个时候就称为销毁状态。系统最倾向回收销毁状态的 Activity,从而保证内存充足。

2.4.3 Activity 的生存期

Activity 中定义了 7 个回调方法,覆盖了声明周期的每一个环节。

onCreate()

Activity 第一次被创建的时候调用。应该在这个方法里完成 Activity 的初始化操作,比如:加载布局、绑定事件等。

onStart()

这个方法在 Activity 由不可见变为可见的时候调用

onResume()

这个方法在 Activity 准备好和用户进行交互的时候调用。此时 Activity 一定位于栈顶,并且处于运行状态

onPause()

在系统准备启动或者恢复另一个 Activity 的时候调用。我们通常会在这个方法中将一些消耗 CPU 的资源释放掉,以及保存一些关键的数据,但是这个方法的执行速度一定要快,不然会影响到新的栈顶 Activity 的使用。

onStop()

这个方法在 Activity 完全不可见的时候调用。它和 onPause 的主要区别在于,如果启动的 Activity 是一个对话框式的 Activity 的时候,那么 onPause() 会得到执行,而 onStop() 不会执行。

onDestroy()

这个方法在 Activity 被销毁 调用,之后 Activity 的状态就处于销毁状态。

onRestart()

这个方法 Activity 由停止状态变为运行状态之前调用,也就是 Activity 被重新恢复了。

以上的 7 个方法除了 onRestart() 方法外,其余的都是两两相对,从而又将 Activity 分为 3 对生存期。

完整生存期

Activity 在 onCreate()onDestroy() 方法之间所经历的,就是完整的生存期。一般情况下 Activity 会在 onCreate() 方法中完成各种初始化操作,onDestroy() 中完成释放内存操作。

可见生存期

Activity 在 onStart()onStop() 方法之间所经历的就是完整的可见生存期。在可见生存期内,Activity 对用户是可见的,但是可能无法了用户交互。可以通过这两个方法来合理的管理那些对用户可见的资源。比如在 onStart() 方法中对资源进行加载,而 onStop() 方法中对资源进行释放,从而保证处于停止状态的 Activity 不会占用过多的内存。

前台生存期

Activity 在 onResume()onPause() 方法之间所经历的就是前台生存期。在前台生存期,Activity 总是处于运行状态,此时 Activity是可以与用户交互的,我们平时看到和接触最多的就是这个状态下的 Activity 了。

2.4.4 体验 Activity 的生命周期

上面主要是理论的知识,下面从实战方向出发,去体验一下 Activity 的生命周期。

这里新建一个项目,项目中有两个 Activity ,一个是普通的 Activity ,一个是对话框式的 Activity。体现对话框式的 Activity 就是要修改一下这个 Activity 的样式。在 AndroidManifest.xmlActivity 标签配置中

<activity android:name=".DialogActivity"android:theme="@style/Theme.AppCompat.Dialog">
</activity>

就是通过 android:theme 属性来设置。Android 系统内置了很多的主题可以选择。

MainActivity 中有两个按钮,第一个按钮启动 NormalActivity ,第二个按钮启动 DialogActivity。

下面启动 MainActivity,这个时候的打印信息是:

MainActivity:onCreate
MainActivity:onStart
MainActivity:onResume

然后点击第一个按钮启动 NormalActivity,打印信息:

MainActivity:onPause
MainActivity:onStop

由于 NormalActivity 已经把 MainActivity 彻底遮挡住了,因此 onPause 和 onStop 方法都执行。

然后按下 Back 键,返回到 MainActivity ,打印信息:

MainActivity:onRestart
MainActivity:onStart
MainActivity:onResume

由于之前 MainActivity 已经进入了停止状态,所以 onRestart 方法会得到执行。

点击第二个按钮,启动 DialogActivity,此时打印信息:

MainActivity:onPause

onStop 方法并没有执行,这是因为 DialogActivity 并没有完全遮盖住 MainActivity,此时 MainActivity 只是进入了暂停状态,并没有进入停止状态。

2.4.5 Activity 被回收了怎么办?

一个 Activity 在进入了停止状态后,就有可能会被系统回收。

比如:应用中有一个 Activity A,用户在 A 的基础上启动了 Activity B ,这个时候 A 进入了停止状态,由于系统内存不足,A 被回收了。然后用户按下了 Back 键返回 A 。这个时候会出现什么问题呢?

其实 A 会正常显示,只不过不会执行 onRestart 方法了,而是会执行 onCreate 方法。重新创建一次。那么之前的状态就全没有了。

这个时候 onSaveInstanceState() 方法排上用场了,这个方法可以保证在 Activity 被回收前一定会被调用,因此我们可以通过这个方法来保存 Activity 被回收前的状态数据。

@Override
protected void onSaveInstanceState(Bundle outState){super.onSaveInstanceState(Bundle outState);String tempData = "要保存的状态";outState.putString("data",tempData);
}

数据保存下来了,然后我们就可以通过 onCreate() 方法中的参数来获取里面的数据了。

activity 生命周期_从0系统学Android-2.4 Activity 的生命周期相关推荐

  1. android activity启动模式_从0系统学Android--2.5Activity启动模式

    本系列文章目录:更多精品文章分类 本系列持续更新中-. Activity 的启动模式一共有四种,分别是:standard.singleTop.singleTask.singleInstance .在实 ...

  2. android 发送广播_从0系统学Android--5.2 发送广播

    从0系统学Android--52 发送广播 本系列文章目录:更多精品文章分类 本系列持续更新中-. 初级阶段内容参考<第一行代码> 5.3 发送自定义广播 前面已经学习了如何接受广播了,下 ...

  3. activity 生命周期_死磕Android_App 启动过程(含 Activity 启动过程)

    1. 前言 Activity是日常开发中最常用的组件,系统给我们做了很多很多的封装,让我们平时用起来特别简单,很顺畅.但是你有没有想过,系统内部是如何启动一个Activity的呢?Activity对象 ...

  4. 从0系统学 Android--1.1认识 Android

    一转眼工作也有几年的时间了,一直想沉下心来,再回过头来重新系统的学习一遍 Android.所以就有了这个读书笔记.俗话说温故而知新,下面就请大家再跟着我系统的学习一篇 Android 吧! 这一系列主 ...

  5. codova添加android慢_从 0 开始学 Linux 内核之 android 内核栈溢出 ROP 利用

    作者:Hcamael@知道创宇404实验室 最近在研究一个最简单的android内核的栈溢出利用方法,网上的资料很少,就算有也是旧版内核的,新版的内核有了很大的不同,如果放在x86上本应该是很简单的东 ...

  6. android 4.0系统,全新Android 4.0系统_手机Android频道-中关村在线

    与搭载Android 2.3系统的OPPO R807不同,OPPO R817搭载了Android 4.0系统.不过这款手机仍旧舍弃了Android系统的原生界面,因此两款手机在界面上的变化其实并不非常 ...

  7. 华为云电脑.模式_今晚0元学华为云计算HCIA课程!快上车,提前了解云计算三种服务模式...

    点上方蓝字关注,每天都有新收获! 学网络,就在IE-LAB 国内高端网络工程师培养基地 今晚0元学华为云计算HCIA课程! 快上车啦 今晚7:30--9:30 扫码火速报名 云计算是一种全新的商业模式 ...

  8. 系统学Android从零开始,搞懂这些直接来阿里入职

    开头 很多人说Android开发前景越来越差了 我觉得这个回答是片面的 首先Android应用开发前景差是在最近两年出现的,也就是从2018开始,从那时起移动端的程序员已经慢慢出现供大于求的局面,本人 ...

  9. activity 启动模式_腾讯大牛:你根本不懂Activity!

    码个蛋(codeegg)第 583 次推文 作者:厘米姑娘 原文:https://www.jianshu.com/p/602b1ec4ca7a 在之前的Activity篇主要学习Activity的生命 ...

最新文章

  1. linux insight 使用教程,Insight API开源项目分析
  2. Android socket 编程 实现消息推送
  3. HNSW算法原理(二)之删除结点
  4. JavaScript实现kruskal克鲁斯卡尔算法(附完整源码)
  5. GDCM:解析XPATH文件的测试程序
  6. 将应用打包为 Snaps
  7. 3步实现Jetty和Eclipse集成
  8. java全局异常处理_详解Spring全局异常处理的三种方式
  9. Apache 虚拟主机
  10. 跟随冒号畅游编程世界
  11. iPhone 13 Pro 成本价曝光,不到4000元
  12. SpringBoot项目整合Retrofit最佳实践,这才是最优雅的HTTP客户端工具!
  13. 这7个问题,软件测试面试必问!!!
  14. 笔记本电脑触摸板的正确使用方法 --转摘
  15. 记一次悲惨的excel导出事件
  16. 东芝打印机共享怎么设置_东芝2303am网络打印设置教程
  17. Java序列化神器——Jprotobuf(小白篇)
  18. BlenderGIS:No ImageIO解决办法 天地图地图资源
  19. Java实现 LeetCode 623 在二叉树中增加一行(遍历树)
  20. 微信小程序10-微搭模板

热门文章

  1. 复旦大学肖仰华教授:知识图谱落地的基本原则与最佳实践
  2. 【腾讯面试题】SQL语句优化方法有哪些?
  3. MyBatis框架:延迟加载策策略、一级缓存、二级缓存
  4. python predict_proba_sklearn中的predict_proba方法的返回值的意义
  5. 队列的基本操作_如果让你手写个栈和队列,你还会写吗?||CSDN博客精选
  6. 安装程序检测到无法验证文件的发行者_InstallShield Installation 文件
  7. android获取apk名称_安卓逆向——APK安装流程
  8. linux安全服务管理,Linux系统安全管理服务配置方法与技巧
  9. 一个小小的String问题引发的血案
  10. Vue 3 —— 当 data 和 ref 相同时 运行时错误 [ReferenceError: xxx is not defined]