从0系统学Android-2.4 Activity 的生命周期
本系列文章,参考《第一行代码》,作为个人笔记
更多内容:更多精品文章分类
本系列持续更新中....
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.xml
的 Activity
标签配置中
<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() 方法中的参数来获取里面的数据了。
从0系统学Android-2.4 Activity 的生命周期的更多相关文章
- Android组件系列----Activity的生命周期
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Android开发之Activity的生命周期以及加载模式
本篇博客就来好好的搞一下Activity的生命周期,如果搞过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类似.生命周期,并不难理解.一个人的生命周 ...
- android 基础02 - Activity 的生命周期及状态
返回栈 Android 中的 Activity 是可以层叠的,当我们启动一个新的 Activity 时,就会覆盖在原有的 Activity 之上, 点击 Back 会销毁当前 Activity,下面的 ...
- Android教程 -06 Activity的生命周期
本篇播客我们重点介绍下如下知识点: 程序启动原理 Activity生命周期 Activity销毁与创建 视频建议采用超清模式观看, 欢迎点击订阅我的优酷 程序启动原理 当用户从主界面点击程序图标时,系 ...
- Android Studio 之 Activity 的生命周期
翻转屏幕,会重新加载Activity package com.example.activitylivecycle; import android.os.Bundle; import android.u ...
- Android学习笔记----Activity的生命周期图示
转载,一目了然.
- 从0系统学Android--2.6 Activity 的最佳实践
从0系统学Android--2.6 Activity 的最佳实践 本系列文章目录:更多精品文章分类 本系列持续更新中.... 实践中的技巧 2.6.1 知晓当前是在哪个 Activity 这个其实很简 ...
- 从0系统学Android-2.5更多隐式Intent用法
本系列文章,参考<第一行代码>,作为个人笔记 更多内容:更多精品文章分类 从0系统学Android-2.5更多隐式Intent用法 上一节中我们学习了通过隐式 Intent 来启动 Act ...
- 从0系统学Android--4.1探究碎片
从0系统学Android--4.1探究碎片 本系列文章目录:更多精品文章分类 本系列持续更新中.... 初级阶段内容参考<第一行代码> 第四章:手机平板要兼顾--探究碎片 平板电脑和手机最 ...
随机推荐
- 携程PMO--扑克派对,我的估算我做主!
转自本人运营的公众号“ 携程技术中心PMO”(ID:cso_pmo) 作者简介 Ollie Guan,携程PMO高级项目集经理,负责敏捷总动员及携程技术中心PMO微信公众号运营.上海AUG ...
- 在Linux 中搭建 Mysql
在本次搭建,出现了各种问题,一直解决不掉,建议各位小伙伴不要像我一样,像一个无头的苍蝇一样,这有问题就解决这个问题,没有意识本质实在的问题. 主要问题(加星,标重点):一定要看自己的linux 版本, ...
- 13-Node.js学习笔记-MongoDB
数据库相关概念 在一个数据库软件最终可以包含多个数据仓库,在每个数据仓库中可以包含多个数据集合,每个数据集合中可以包含多条文档(具体的数据) database: 数据库,mongoDB数据库软件中可以 ...
- vc6.0 绿色版 下载地址
最新版的vs2019已经完全不支持生成运行在xp下的应用程序 每次在xp下测试,都需要配置好vc6.0,但乱七八糟的太多了,给出地址,绿色版可用 http://www.downcc.com/soft/ ...
- Oracle模糊查询CONCAT参数个数无效
在使用MyBatis操作Oracle数据库的时候,写模糊查询突然发现原本在MySql中正确的代码,在Oracle中报错,参数个数无效 <if test="empId!=null and ...
- golang 自动下载所有依赖包
go get -d -v ./... -d标志只下载代码包,不执行安装命令: -v打印详细日志和调试日志.这里加上这个标志会把每个下载的包都打印出来: ./...这个表示路径,代表当前目录下所有的文件 ...
- PlayJava Day025
JTable 用JTable类可以以表格的形式显示和编辑数据 JTable类的对象并不存储数据,它只是数据的表现 MVC 数据.表现和控制三者分离,各负其责 M = Model(模型) V = Vie ...
- C#本地文件下载以及FTP文件服务下载(以Pdf文件为例)
一.C#实现本地文件下载 1.文件下载的路径 文件名称 以及文件下载之后要放的位置 这三个变量是必须要的 2.定义以下四个对象: FileWebRequest ftpWebRequest = nu ...
- 编译原理之LL(1)文法的判断,递归下降分析程序
1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...
- ftp上传文件,上传的文件大小是0
此问题是最近出现,代码和配置完全没改,试过所有的办法,两天了一直都解决不了,用完弃坑. 防火墙.被动模式主动模式,编码,服务端内存,日志,common-net.jar版本问题,服务端配置,nginx配 ...