Activity 关于生命周期一些问题的实践验证
Activity 关于生命周期一些问题的实践验证
本文内容
1. 如何验证问题
2. 正常情况下的生命周期
3. 由活动 A 启动活动 B 时,活动 A 的 onpause() 和 B 的 onResume() 哪一个先执行?
4. dialog 是否会对生命周期产生影响?
4.1 标准的 AlertDialog 是否有影响?
4.2 全屏的 AlertDialog 是否有影响?
4.3 主题为 Dialog 的 Activity 是否有影响?
5. 横竖屏切换时生命周期变化
6. 内存不足杀死 Activity 时的生命周期变化
7. 异常情况下数据保存
8. 异常情况下,系统默认恢复 EditText 的文本信息
9. 异常情况下,系统默认恢复 TextView 的文本信息
10. 防止重建
1. 如何验证问题
创建一个 MainActivity 、 FirstActivity 类以及一些验证问题的 Dialog 等等其他的类,MainActivity 是项目的主界面。MainActivity 与 FirstActivity 的生命周期方法中都打印了日志。
相关验证代码在:activityproject
2. 正常情况下的生命周期
点击应用到界面显示出来的生命周期
结论:第一次打开 MainActivity ,调用了 onCreate() -> onStart() -> onResume() 方法。按下电源键时的屏保的生命周期
结论:屏保时的生命周期调用为:onPause() -> onStop() 。亮屏时的生命周期
结论:亮屏时的生命周期调用为:onRestore() -> onStart() -> onResume() 。按 home 键时的生命周期
结论:按下 home 键时的生命周期调用为:onPause() -> onStop() 。按 home 键后重新打开界面的生命周期(从后台应用打开的生命周期是相同的)
结论:按下 home 键之后重新打开界面时的生命周期调用为:onRestore() -> onStart() -> onResume() 。在显示界面点击返回键退出的生命周期
结论:关闭 MainActivity ,调用了 onPause() -> onStop() -> onDestory() 方法。
3. 由活动A启动活动B时。活动A的 onPause() 与活动B的 onResume() 哪一个先执行?
在 MainActivity 界面中添加一个按钮,点击按钮跳转 FirstActivity 界面。
- 打开 MainActivity 界面,在 MainActivity 跳转到 FirstAcivity ,运行结果如下:
可以看到,是 MainActivity 先执行了 onPause() , FirstActivity 的 onResume() 后执行的。
- 点击返回看一下执行的顺序:
点击返回后,可以看到是 FirstActivity 的 onPause() 先执行,MainActivity 的 onResume() 后执行。
结论:当活动 A 启动活动 B 时,是活动 A 的 onPause() 方法先执行,活动 B 的 onResume() 方法后执行。
4.dialog 是否会对生命周期产生影响?
查看 Activity 生命周期的描述,如果 Activity 不在前台,且并非完全不可见时, Activity 就会处在 onPause() 的暂停状态。但是事实如何,用代码说话,测试三种情况:一,弹出标准的 AlertDialog ;二,弹出全屏的 AlertDialog ;三,弹出主题为 Theme.AppCompat.Dialog 的 Activity ,查看这三种情况下的生命周期的变化:
4.1 标准的 AlertDialog 是否有影响?
在 MainActivity 的布局中添加一个弹出标准 AlertDialog 的按钮,用于观察 MainActivity 在弹出 AlertDialog 和隐藏 AlertDialog 的情况下的生命周期变化。
点击弹出标准 AlertDialog 的生命周期的运行
可以看到弹出标准的 AlertDialog 并不会对 MainActivity 的生命周期有任何的影响。点击 AlertDialog 的“确定”按钮,对 AlertDialog 进行隐藏,观察 MainActivity 的生命周期的变化
点击 AlertDialog 的“确定”按钮后,看到没有任何的日志打印出来,所有隐藏标准 AlertDialog 也不会对 MainActivity 的生命周期有任何的影响。
结论:显示和隐藏标准的 AlertDialog 不会对 MainActivity 的生命周期有任何的影响。
4.2 全屏的 AlertDialog 是否有影响?
在 MainActivity 的布局中添加一个弹出全屏 AlertDialog 的按钮,用于观察 MainActivity 在弹出全屏 AlertDialog 和隐藏全屏 AlertDialog 的情况下的生命周期变化。
点击弹出全屏 AlertDialog 的生命周期的运行
可以看到弹出全屏的 AlertDialog 并不会对 MainActivity 的生命周期有任何的影响。点击 AlertDialog 的“确定”按钮,对 AlertDialog 进行隐藏,观察 MainActivity 的生命周期的变化
点击 AlertDialog 的“确定”按钮后,看到没有任何的日志打印出来,所有隐藏全屏 AlertDialog 也不会对 MainActivity 的生命周期有任何的影响。
结论:显示和隐藏全屏的 AlertDialog 不会对 MainActivity 的生命周期有任何的影响。
4.3 主题为 Dialog 的 Activity 是否有影响?
在 MainActivity 的布局中添加一个跳转主题为 Theme.AppCompat.Dialog 的 Activity 的按钮,用于观察 MainActivity 在跳转主题为 Theme.AppCompat.Dialog 的 Activity 和从 主题为 Theme.AppCompat.Dialog 的 Activity 返回的情况下的生命周期变化。
跳转主题为 Dialog 的 Activity 的生命周期变化
可以看到跳转主题为 Dialog 的 Activity 会对 MainActivity 的生命周期产生影响,生命周期的变化与跳转 Activity 的变化相同。在主题为 Dialog 的 Activity 下点击返回键的生命周期变化
在主题为 Dialog 的 Activity 下点击返回键,返回到 MainActivity 的界面,从运行结果可以看出,与跳转 Activity 之后返回的声明周期变化不同,MainActivity 只调用了 onResume() 方法,并没有调用 onRestart() 与 onStart() 两个方法,DialogActivity 调用 onPause()、onStop() 与 onDestory() 方法。
结论:主题为 Dialog 的 Activity 会对 MainActivity 的生命周期有影响,并且跳转主题为 Dialog 的 Activity 与跳转普通的 Activity 的生命周期变化相同。
5. 横竖屏切换时生命周期变化
MainActivity 在横竖屏切换时生命周期的变化:
结论:横竖屏切换时的生命周期调用为:onPause() -> onStop() -> onDestory() -> onCreate() -> onStart() -> onResume() 。就是一个销毁再重建的过程。
内存不足杀死 Activity 时的生命周期变化
模拟内存不足杀死应用:先打开应用,然后按 home 键,使应用进入后台,然后使用命令 adb shell am kill 包名
将应用杀死。
- 从打开应用到杀死应用的生命周期变化如下:
在按 home 键之后,MainActivty 调用了 onPause() 与 onStop() 方法,并没有调用 onDestory() 方法,所以主进程现在属于后台进程。
结论:内存不足时,杀死应用,前台的 Activity 生命周期为 onPause() -> onStop() 。 - 然后在点击应用的图标,打开应用,生命周期变化如下:
可以看到 MainActivity 调用了 onCreate()、onStart() 和 onResume() 方法,Activity 重新创建了。
7. 异常情况下数据保存
在 MainActivity 中覆盖 onSaveInstanceState 和 onRestoreInstanceState 两个方法。在 onSaveInstanceState 方法中保存 key 值为 message ,值为 onSaveInstanceState 的数值,在 onRestoreInstanceState 方法中获取 key 值为 message 对应的数值,使用横竖屏切换来测试这两个方法的调用,以及保存数值的获取。
从 MainActivity 开启到切换横竖屏的生命周期变化如下:
横竖屏切换时,MainActivity 调用了 onSaveInstanceState() 方法,切换之后 MainActivity 重新创建,并且调用了 onRestoreInstanceState() 方法,并从 Bundle 中取得了 onSaveInstanceState() 方法中保存的数据。再切换回来的生命周期变化如下:
切换回来与切换的时候的生命周期变化一样,先调用了 onSaveInstanceState() 方法,切换后 MainActivity 重新创建并调用 onRestoreInstanceState() 方法,并从 Bundle 中取得了 onSaveInstanceState() 方法中保存的数据。
onCreate() 方法中也能获取 onSaveInstanceState 方法中保存的数据,在 MainActivity 的 onCreate() 方法中增加获取代码。
- 横竖屏切换之后 onCreate() 打印的日志如下:
在 MainActivity 重新创建时,调用了 onCreate() 方法,并从 onCreate() 方法的 Bundle 中获取到 onSaveInstanceState() 方法中存储的值。注意:onCreate() 中从 Bundle 中获取数据之前,一定要判空,因为第一次进入的时候,Bundle 是空的,会有空指针异常。
8. 在异常情况下,系统默认恢复 EditText 的文本信息
在 MainActivity 的布局文件中添加 EditText,打开应用后,在输入框内输入一些文字。在横竖屏切换后观察输入框内的文字是否和切换之前的文字相同。(通过横竖屏切换观察信息,注意 EditText 需要添加 id 才行)
从打开应用,到横竖屏切换之后输入框的文字内容如下:
在切换横竖屏时,onPause() 方法中打印了 EditText 的文本内容,切换重建后,在 onResume() 中获取到 EditText 的内容与之前的内容相同,并且要注意,重建后 onCreate() 与 onStart() 方法中获取 EditText 的文本内容都是为空。
9. 在异常情况下,系统默认恢复 TextView 的文本信息
通过转屏观察信息,这里只是通过 setText 方法动态设置文本内容,在这种情况下加了 id 也无法自动保存,这种情况可以通过给 TextView 设置 freezesText 属性才能自动保存。
打开应用后在点击弹出标准的 AlertDialog 时修改 TextView 的内容,横竖屏切换后,观察 TextView 的内容是否和切换之前的文字相同。
从打开应用,到横竖屏切换之后 TextView 的文字内容如下:
在切换横竖屏时,onPause() 方法中打印了 TextView 的文本内容,切换重建后,在 onResume() 中获取到 TextView 的内容与之前的内容相同,并且要注意,重建后 onCreate() 与 onStart() 方法中获取 TextView 的文本内容是布局文件中的默认内容。
10. 防止重建
将 MainActivity 的 android:configChanges 设置为 orientation ,在横竖屏切换的时候防止重新被创建。
- 横竖屏切换时,生命周期的变化如下:
可以看到在第一次进入 Activity 会调用 onCreate() -> onStart() -> onResume() 创建,之后切换横竖屏并不会有任何的生命周期方法的调用。
Activity 关于生命周期一些问题的实践验证的更多相关文章
- Activity 之生命周期
Activity 之生命周期 本文内容: 1. Activity 介绍 2. Activity 的生命周期 2.1 生命周期图 2.2 常见情况下生命周期的回调 2.3 关于生命周期常见问题 2.4 ...
- activity的生命周期详解
刚在看mars老师的视频,看到activity的生命周期,就看了一下,总结了一下.下面是各函数的调用时机 为了更清楚的看清楚工作的具体过程,举例如下: ,建立两个activity,一个main,一个a ...
- android学习四(Activity的生命周期)
要学好活动(Activity).就必需要了解android中Activity的声明周期.灵活的使用生命周期.能够开发出更好的程序,在android中是使用任务来管理活动的,一个任务就是一组存放在栈里的 ...
- 快速掌握activity的生命周期
activity的生命周期不管是在面试还是在工作中我们都会经常遇到,这当然也是非常基础的,基础也很重要哦,学会activity的生命周期对我们以后开发更健壮的程序会有很大帮助.下面来看一下Activi ...
- Android开发之Activity的生命周期以及加载模式
本篇博客就来好好的搞一下Activity的生命周期,如果搞过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类似.生命周期,并不难理解.一个人的生命周 ...
- Activity的生命周期
Activity的生命周期 以往我们实现页面间的跳转都是实例化Intent类的对象,但是页面在我们眼前的出现与消失没有我们所看到的那么简单,它有一个复杂的生命周期,一个页面的出现,被覆盖,再次出现,被 ...
- 浅谈Android中Activity的生命周期
引言 我想对于Android开发人员来说,Activity是再熟悉不过了,今天我们就来探讨下Activity的生命周期.熟悉的掌握Activity对于开发健壮的Android应用程序来说至关重要.下面 ...
- 每天一点Android干货-Activity的生命周期
Activity Activity是这样一个程序组件,它为用户提供一个用于任务交互的画面. 一个应用程序通常由多个activity组成,它们彼此保持弱的绑定状态.典型的,当一个activity在一个应 ...
- Android中Activity的生命周期
简介: 这个基本是必问的问题了,说一下你对Activity生命周期的理解,呵呵… onCreate, onStart, onResume, onPause, onStop, onDestroy, on ...
随机推荐
- aliyun TableStore相关操作汇总
总结:这个东西本身可能技术还不成熟,使用的人少,有问题很验证解决 遇到的问题:(1)没有一个GUI工具,使用门槛高(2)查询的GetRange不方便,把查询出来的数据使用System.out.prin ...
- 用beego开发服务端应用
用beego开发服务端应用 说明 Quick Start 安装 创建应用 编译运行 打包发布 代码生成 开发文档 目录结构说明 使用配置文件 beego默认参数 路由设置 路由的表述方式 直接设置路由 ...
- bzoj4476 [Jsoi2015]送礼物
化简式子 $M>=m+ans*(r-l+k)$ 发现$M,m$确定时,总区间长度越小越好,于是假定右端点为最小值$M+ans*l>=m+ans*r+ans*k$, 右面都确定了,但最大值仍 ...
- BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法
BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...
- CentOS 7下单机部署RabbltMQ环境的操作记录
一. RabbitMQ简单介绍 在日常工作环境中,你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息 ...
- 高数量类别特征(high-cardinality categorical attributes)的预处理方法
high-cardinality categorical attributes,从字面上理解,即对于某个category特征,不同值的数量非常多,这里暂且把它叫做高数量类别属性.反之,即低数量类别属性 ...
- 记录Ocelot + SignalR 多服务端测试
前言 分两个项目,一个Gatway,一个SignalR 贴代码 1.Gatway 1.引用Ocelot 2.添加一点点代码 Startup.cs 3.简单配置ocelot ocelot.json { ...
- Google 的 QUIC 华丽转身成为下一代网络协议: HTTP/3.0
HTTP/2.0 还没有普及,HTTP/3.0 标准就要被制定了. 据 IETF 透露,HTTP-over-QUIC 实验协议将被重命名为 HTTP/3,并成为 HTTP 协议的第三个正式版本. IE ...
- api接口参数问题
对于取数据,我们使用最多的应该就是get请求了吧.下面通过几个示例看看我们的get请求参数传递. 回到顶部 1.基础类型参数 [HttpGet] public string GetAllChargin ...
- Dapper 链式查询 扩展
Dapper 链式查询扩展 DapperSqlMaker Github地址:https://github.com/mumumutou/DapperSqlMaker 欢迎大佬加入 Demo: 查询 ...