XML
<activity
android:name=".activity.MoreFuncActivity"
android:exported="false"
android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard"
/>
项目清单文件中看到
android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard"
不太清楚这个属性的作用,特地学习下,避免踩坑
android:configChanges是Android清单文件(Manifest)中Activity标签的一个重要属性,用于指定当设备配置发生变化时,Activity应该如何响应。
默认情况下,当设备配置发生变化(如屏幕旋转、键盘弹出等),Android系统会销毁并重新创建当前Activity,导致Activity状态丢失。开发者需要在onSaveInstanceState()和onRestoreInstanceState()中处理状态保存与恢复。
设置此属性的目的
通过设置android:configChanges,开发者可以告诉系统"不要重新创建Activity,而是调用onConfigurationChanged()方法",让开发者自行处理配置变化,避免Activity重建带来的性能开销和状态管理复杂性。
例子中包含的属性配置变化:
- keyboardHidden - 软键盘显示/隐藏状态变化
- orientation - 屏幕方向变化(横屏/竖屏)
- screenSize - 屏幕尺寸变化(Android 3.2+引入,通常与屏幕旋转相关)
- navigation - 导航方式变化(如从触控变为方向键导航)
- keyboard - 物理键盘可用性变化(如折叠键盘展开/收起)
下表字符串是该属性的所有有效值(若有多个值,则使用 | 进行分隔,例如 "locale|navigation|orientation")。
| 值 | 说明 |
|---|---|
"colorMode" |
屏幕的颜色模式功能(色域或动态范围)已更改。 注意 :activity 使用 colorMode 属性或在运行时请求的颜色模式不同于支持不同颜色模式的功能。更改所用颜色模式的 activity 不会导致配置更改,因为显示屏的颜色功能没有更改。 |
"density" |
显示密度的更改,例如当用户指定不同的显示比例或其他屏幕当前处于活跃状态时。 在 API 级别 24 中引入。 |
"fontScale" |
字体缩放比例的更改,例如当用户选择新的全局字体大小时。 |
"fontWeightAdjustment" |
字体粗细增加量已发生变化。 |
"grammaticalGender" |
相应语言的语法性别已更改。请参阅 GrammaticalInflectionManager。 在 API 级别 34 中引入。 |
"keyboard" |
键盘类型的更改,例如当用户插入外接键盘时。 |
"keyboardHidden" |
键盘无障碍功能的更改,例如当用户显示硬件键盘时。 |
"layoutDirection" |
布局方向的更改,例如从由左到右 (LTR) 改为由右到左 (RTL)。 在 API 级别 17 中引入。 |
"locale" |
语言区域的更改,例如当用户选择显示文本所用的新语言时。 |
"mcc" |
当系统检测到用于更新 MCC 的 SIM 卡时,IMSI 移动设备国家/地区代码 (MCC) 发生的更改。 |
"mnc" |
当系统检测到用于更新 MNC 的 SIM 卡时,IMSI 移动网络代码 (MNC) 发生的更改。 |
"navigation" |
导航类型(轨迹球或方向键)的 TA 更改。通常不会出现这种情况。 |
"orientation" |
屏幕方向的更改,例如用户旋转设备时。 注意 :如果应用面向 Android 3.2(API 级别 13)或更高版本的系统,则还应声明 "screenLayout" 和 "screenSize" 配置,因为当设备在纵向模式与横向模式之间切换时,屏幕布局和屏幕大小可能会发生变化。 |
"screenLayout" |
屏幕布局的更改,例如在其他屏幕变为活动状态时。 |
"screenSize" |
当前可用屏幕尺寸的更改。 该值表示目前可用尺寸相对于当前宽高比的变更,当用户在横向模式与纵向模式之间切换时,它便会发生变更。 在 API 级别 13 中引入。 |
"smallestScreenSize" |
实体屏幕尺寸的更改。 该值表示与方向无关的尺寸变更,因此它只有在实际物理屏幕尺寸发生变更(如切换到外部显示器)时才会变化。对此配置所作变更对应 smallestWidth 配置的更改。 在 API 级别 13 中引入。 |
"touchscreen" |
触摸屏模式的更改,例如当用户连接或断开输入外围设备或在不同显示屏之间移动应用时。 |
"uiMode" |
界面模式的更改,例如当用户将设备放到桌面或车载基座上时,或者夜间模式发生变化时。如需了解有关不同界面模式的更多信息,请参阅 UiModeManager。 在 API 级别 8 中引入。 |
所有这些配置变更都可能影响应用所看到的资源值。因此,调用 onConfigurationChanged() 时,通常必须再次检索所有资源(包括视图布局和可绘制对象),才能正确处理更改。