Android横竖切屏生命周期回调情况

来源:互联网 发布:电脑测温度软件 编辑:程序博客网 时间:2024/06/14 00:52

当未设置android:configChanges=”orientation”时:

第一,首次进入Activity会回调的生命周期是:

这里写图片描述

第二,竖屏切换为横屏

这里写图片描述

第三,再从横屏切换为竖屏
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume

当设置android:configChanges=”orientation”时:
第一点相同,第二点多打印了onConfigurationChanged,但是高版本并未回调该方法,第三点不再出现两次创建与销毁

总结:
4.0以下版本:
1.不设置 AndroidManifest.xml 文件中的 Activity 元素的 android:configChanges 时,
切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;
2.设置了 AndroidManifest.xml 文件中的 Activity 元素的
android:configChanges=”orientation”时,
切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次;
3.设置了 AndroidManifest.xml 文件中的 Activity 元素的
android:configChanges=”orientation|keyboardHidden”时,
切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法!

4.0以上版本:
不设置以下配置时,哪怕设置了orientation|keyboardHidden这两个属性:

android:configChanges="orientation|keyboardHidden|screenSize"

不管横竖切屏都会调用如下声明周期

这里写图片描述

设置了如上属性,Activity不会被重新创建,只会回调onConfigurationChanged方法

三、注意点:
1.当前 Activity 产生事件弹出 Toast 和 AlertDialog 的时候 Activity 的生命周期不会有改变!
2.Activity 运行时按下 home 键(跟被完全覆盖是一样的):
代码如下:
onSaveInstanceState –> onPause –> onStop
onRestart –> onStart –> onResume
3.Activity 未被完全覆盖只是失去焦点:
代码如下:
onPause –> onResume

四、相关权限
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>

通常我们去切换屏幕方向是不希望Activity被重新创建,这时就需要对一些属性进行设置,或者使用代码设置。

设置屏幕方向代码代码
1、配置screenOrientation属性,注意配置在application里面无效,必须配置在activity里面

<activity            android:name=".TestActivity"            android:screenOrientation="portrait"            android:configChanges="orientation|keyboardHidden|screenSize"            android:launchMode="singleTop"            android:theme="@style/AppTheme.NoActionBar" />

2、代码设置横竖屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

3、判断横竖屏状态
系统API中的定义:
int ORIENTATION_PORTRAIT = 1; 竖屏
int ORIENTATION_LANDSCAPE = 2; 横屏

//获取屏幕的方向  ,数值1表示竖屏,数值2表示横屏int screenNum = getResources().getConfiguration().orientation;

解释:
portrait 翻译是肖像的意思,肖像一般都是竖直方向
landscape 翻译是景观的意思,景物一般是横着方向,看得广阔点

configChanges属性可以设置多个值,中间使用竖线分割,常用前三条
1、 orientation 屏幕在纵向和横向间旋转
2、keyboardHidden 键盘显示或隐藏
3、screenSize 屏幕大小改变了
4、fontScale 用户变更了首选的字体大小
5、locale 用户选择了不同的语言设定
6、keyboard 键盘类型变更,例如手机从12键盘切换到全键盘
7、touchscreen或navigation 键盘或导航方式变化,一般不会发生这样的事件

screenOrientation有如下选项,只能选择一个值,通常设置都是横屏或竖屏,这里只是设置的一个默认值,屏幕的方向还是可以通过代码改变
1、unspecified 默认值,由系统判断状态自动切换
2、landscape 横屏
3、portrait 竖屏
4、user 用户当前设置的orientation值
5、behind 下一个要显示的Activity的orientation值
6、sensor 使用传感器 传感器的方向
7、nosensor 不使用传感器 基本等同于unspecified

原创粉丝点击