Android ConfigChanges属性简介

我们知道在运行时发生配置变更时,默认情况下会关闭Activity并将其重启,但是使用该属性声明配置将阻止Activity重启。相反,Activity会保持运行状态,并且系统会调用其onConfigurationChanged()方法。任何或所有下列字符串均是该属性的有效值。若有多个值,则使用 "|" 进行分隔,例如:"locale|navigation|orientation"。

描述
"density"

显示密度发生变更 - 用户可能已指定不同的显示比例,或者有不同的显示现处于活跃状态。

此项为API24中的新增配置

"fontScale" 字体缩放系数发生变更 - 用户已经选择新的全局字号
"keyboard" 键盘类型发生变更 - 例如,用户插入外置键盘
"keyboardHidden" 键盘无障碍功能发生变更 - 例如,用户显示硬键盘
"layoutDirection" 布局方向发生变更 - 例如,自从左至右(LTR)更改为从右至左(RTL)。
"locale" 语言区域发生变更 - 用户已为文本选择新的显示语言
"mcc" IMSI 移动设备国家/地区代码(MCC)发生变更 - 检测到SIM 并更新 MCC。·
"mnc" IMSI 移动设备网络代码(MNC) 发生变更 - 检测到 SIM 并更新 MNC。
"navigation" 导航类型(轨迹球/方向键)发生变更。(这种情况通常不会发生)
"orientation"

屏幕方向发生变更 - 用户旋转设备。

请注意:如果应用面向Android 3.2 (API13)或者更高版本的系统,则还应声明 "screenSize" 配置,因为当设备在横向与纵向之间切换时,该配置也会发生变更

"screenLayout"

屏幕布局发生变更 - 不同的显示可能处于活跃状态

例如:页面由全屏切换到分屏状态或由分屏状态切换到全屏状态时可以使用此属性值

"screenSize"

当前屏幕尺寸发生变更。

该值表示当前可用尺寸相对于当前纵横比的变更,当用户在横向和纵向之间切换时,它便会发生变更。

"smallestScreenSize"

物理尺寸发生变更。

该值表示与方向无关的尺寸变更,因此它只有在实际物理屏幕尺寸发生变更(如切换到外部显示器)时才发生变化。对此配置所变更对应smallestWidth配置的变化。

"touchScreen" 触摸屏发生变更。(这种情况通常不会发生)
"uiMode"

界面模式发生变更 - 用户已将设备置于桌面或车载基座,或者夜间模式发生变更。

深色模式与浅色模式相互切换时可以使用此属性值

所有这些配置变更都可能影响应用所看到的资源值。因此,调用 onConfigurationChanged() 时,通常有必要再次检索所有资源(包括视图布局、可绘制对象等),以正确处理变更。

请注意:如果处理所有多窗口模式相关的配置变更,请使用 "screenLayout" 和 "smallestScreenSize"。

关于屏幕旋转一般认为有以下几点:在Api 13之前

1. 不设置Activity的android:configChanges时,横竖屏切换回重新调用Activity的各个生命周期,切换横屏会执行一次,切换竖屏会执行两次。

2. 设置Activity的android:configChanges = "orientation"时,切屏还是会重新调用各个生命周期方法,切横,竖屏都会只执行一次。

3. 设置Activity的android:configChanges = "orientation|keyboardHidden"时切屏不会重新调用生命周期,只会调用onConfigurationChanged方法。

但是自从Android 3.2(API 13)之后,在设置Activity的android:configChanges = "orientation|keyboardHidden"后,还是一样会重新执行各个生命周期方法。因为,screen size也会在横竖屏切换的同时发生改变。所以,在app目录下的build.gradle里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation",你还必须设置"ScreenSize"。解决方法:AndroidManifest.xml中设置android:configChanges="orientation|screenSize“

猜你喜欢

转载自blog.csdn.net/zhourui_1021/article/details/114255083