屏幕旋转时 Activity 的生命周期 —— 测试与结论
关于 Android 手机横竖屏切换时 Activity 的生命周期问题,网上有很多相似的文章,大多数都是说明在竖屏切换横屏时 Activity 会重启一次,而在横屏切换竖屏时 Activity 会重启两次。
我本身不太理解这样设计的意义,并且觉得新版本会解决这个问题,所以做了一项测试,测试环境为 Android 7.0 模拟器。
测试
测试首先创建一个新的 Activity,并在其各个生命周期方法内打印日志,并执行如下操作得到结果:
在 targetSdkVersion 的值大于 12 时
- Activity启动
I/System.out: onCreate
I/System.out: onStart
I/System.out: onResume
- 竖屏切换为横屏
I/System.out: onConfigurationChanged
I/System.out: onPause
I/System.out: onSaveInstanceState
I/System.out: onStop
I/System.out: onDestroy
I/System.out: onCreate
I/System.out: onStart
I/System.out: onRestoreInstanceState
I/System.out: onResume
- 横屏切回竖屏
I/System.out: onConfigurationChanged
I/System.out: onPause
I/System.out: onSaveInstanceState
I/System.out: onStop
I/System.out: onDestroy
I/System.out: onCreate
I/System.out: onStart
I/System.out: onRestoreInstanceState
I/System.out: onResume
- 配置
android:configChanges="orientation|screenSize"
后,竖屏切换为横屏
I/System.out: onConfigurationChanged
- 配置
android:configChanges="orientation|screenSize"
后,横屏切回竖屏
I/System.out: onConfigurationChanged
在 targetSdkVersion 的值小于或等于 12 时
- Activity启动
I/System.out: onCreate
I/System.out: onStart
I/System.out: onResume
- 竖屏切换为横屏
I/System.out: onConfigurationChanged
I/System.out: onPause
I/System.out: onSaveInstanceState
I/System.out: onStop
I/System.out: onDestroy
I/System.out: onCreate
I/System.out: onStart
I/System.out: onRestoreInstanceState
I/System.out: onResume
- 横屏切回竖屏
I/System.out: onConfigurationChanged
I/System.out: onPause
I/System.out: onSaveInstanceState
I/System.out: onStop
I/System.out: onDestroy
I/System.out: onCreate
I/System.out: onStart
I/System.out: onRestoreInstanceState
I/System.out: onResume
- 配置
android:configChanges="orientation"
后,竖屏切换为横屏
I/System.out: onConfigurationChanged
- 配置
android:configChanges="orientation"
后,横屏切回竖屏
I/System.out: onConfigurationChanged
总结
可以发现新版本 Android 设备上的运行结果和网上的结论并不完全相同,在横竖屏切换时,都会调用一次 onConfigurationChanged,并重启 Activity 一次,行为完全一致,具体的生命周期为:
I/System.out: onConfigurationChanged
I/System.out: onPause
I/System.out: onSaveInstanceState
I/System.out: onStop
I/System.out: onDestroy
I/System.out: onCreate
I/System.out: onStart
I/System.out: onRestoreInstanceState
I/System.out: onResume
在 targetSdkVersion 的值大于 12 时,配置 android:configChanges="orientation|screenSize"
,
在 targetSdkVersion 的值小于或等于 12 时,配置 android:configChanges="orientation"
,
可以做到拦截 Activity 的重新创建:
I/System.out: onConfigurationChanged
后续
将会对过去版本的 Android 设备做相应的测试,来验证得到结果。
改进
通常研究设备旋转带来的 Activity 重启问题,是为了解决 Activity 重启导致成员变量未保存引发运行出错。但之所以 Activity 会重启是因为运行时配置发生了更变,可能有更适合的资源来匹配新的设备配置,例如在横屏时,有更好利用空间的横版布局资源,这时就需要 Activity 重新加载布局显示。
所以,好的解决办法是利用 onSaveInstanceState(Bundle outState)
方法保存成员变量的值到 Bundle 对象中,在 Activity 重启后,再在 onCreate(Bundle savedInstanceState)
中获取这些保存的信息。
屏幕旋转时 Activity 的生命周期 —— 测试与结论的更多相关文章
- 横竖屏切换时,Activity的生命周期
横竖屏切换时,Activity的生命周期 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate-->onStart-->onRe ...
- Android横竖屏切换和灭屏亮屏时Activity的生命周期探究(1)
研究这个问题的初衷在于项目中碰到了一个问题:横屏的时候灭屏再亮屏,亮屏的时候用户能够清晰的看到先启动竖屏(过程1)再切换到横屏的过程,因为灭屏的时候onSaveInstanceState()保存的时横 ...
- 安卓横竖屏切换时activity的生命周期
关于Activity横竖屏切换的声明周期变化: 1.新建一个Activity并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate-->onStart-->on ...
- Andriod开发---《横竖屏切换时 Activity的生命周期的总结》
横屏切换竖屏Activity的生命周期详解,下面分析一下切换时具体的生命周期: 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate--&g ...
- 测试横竖屏切换时activity 的生命周期
对于这个面试题,相信大家都见过,网上给出的答案是: 1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 2.设 ...
- 单击Android设备后退键,主屏幕键以及旋转屏幕如何影响Activity的生命周期
单击设备的后退键,相当于通知Android系统“我已完成activity的使用,现在不需要它了.”接到指令后,系统立即销毁了activity.即调用onPause()->onStop()-> ...
- Android(java)学习笔记224:横竖屏切换时Activity的生命周期
1.横竖屏切换的生命周期 默认情况下横竖屏切换,先销毁再创建 2.有的时候,默认情况下的横竖屏切换(先销毁再创建),对应用户体验是不好的,比如是手机游戏横竖屏切换对游戏体验非常不好,下面两种方 ...
- Android(java)学习笔记167:横竖屏切换时Activity的生命周期
1.横竖屏切换的生命周期 默认情况下横竖屏切换,先销毁再创建 2.有的时候,默认情况下的横竖屏切换(先销毁再创建),对应用户体验是不好的,比如是手机游戏横竖屏切换对游戏体验非常不好,下面两种方 ...
- 横竖屏切换时Activity的生命周期
设置横竖屏切换时Activity生命周期的属性设置,在清单文件中的Activity节点中设置.根据具体需求设置: 1.不设置Activity的android:configChanges时,切屏会重新调 ...
随机推荐
- 4.js屏蔽浏览器鼠标右键菜单
document.oncontextmenu = function(){return false;} 参考链接:js 屏蔽浏览器事件汇总
- keystone nova v2 python
- Python之线程与GIL
前言 以下内容是个人学习之后的感悟,转载请注明出处~ 线程是什么 线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的 基本单 ...
- PLSQL ORA-12154 TNS无法解析指定的连接标识符
若你的机子上Windows 64位操作系统, 将PL Sql 的默认安装目录 Program Files (x86) 文件夹改为Program Files 或者别的便可以了
- javascript 前段MVVM 框架
http://www.likebin.net/meteorlist.html http://www.cnblogs.com/sskyy/p/3197917.html
- java 关于getProperty()方法中反斜杠问题
问: 在配置文件a.properties中有一行path=C:\test在java中getProperty("path")后,java把\t认为是一个字符TAB.怎样才能取到正确的 ...
- 升级到Angular6后对老版本的RXJS代码做相应的调整
还没有了解过RXJS6的童鞋,可以查看我的另外一篇博文,此篇博文主要是对于RXJS5升级到RXJS6的代码调整示例 RXJS5版本 在RXJS5上我们是这样写请求的 import 'rxjs/add/ ...
- HDU3415【单调队列】
单调队列解决通过维护满足条件内的值,并保证队列里的值单调,解决一个最大最小. 让你求一个k区间长度的最大值,那么就只要搞下前缀和, sum[ i , j ] 区间的和:sum[ j ]-sum[ i ...
- IT兄弟连 JavaWeb教程 JSP动作指令
JSP动作指令语法 JSP动作指令语法格式如下: <jsp:动作名 属性名1="属性值1" 属性名2="属性值2" ... %> JSP具体动作指令 ...
- c语言里面你不知道的break与switch,contiune的用法
前言:最近上完课在宿舍闲来无事,就拿起了C Primer Plus 这本书看,是自己入门编程的第一门语言:看了一些基本语法知识点,最让我需要总一下的是就是标题所说的这个语法知识点,记得大一的时候去考计 ...