折叠屏与 Configuration 变化:连续性如何保持
2026/8/9大约 3 分钟大屏/折叠屏/自由窗口Android 14折叠屏Configuration连续性
折叠屏与 Configuration 变化:连续性如何保持
上一章看了桌面模式。这一章回答:折叠屏展开/折叠会改变什么,系统如何通知应用, 状态连续性怎么保证?
折叠变化首先表现为 Configuration 变化
| 常见误解 | 正确理解 |
|---|---|
| 折叠展开 = 旋转屏幕 | 是尺寸等级与显示特征的复合变化,不只是方向 |
| 状态丢失是正常的 | 正确处理重建与状态保存可以保持连续性 |
| 所有变化都要自己处理 | 可在 manifest 声明 configChanges,交给系统重建或自行处理 |
核心结论
- 折叠展开改变窗口尺寸与显示特征,触发 Configuration 变化。
- 默认行为是重建 Activity,通过 onSaveInstanceState 保留状态。
- 用 android:configChanges 可自行处理,避免重建。
- 尺寸等级(compact → expanded)决定布局切换。
- 连续性 = 布局切换 + 状态保留 + 资源更新。
折叠变化主链
逐步解释:
- 状态变化:折叠/展开改变窗口配置。
- 通知:系统按策略重建或回调。
- 保存:重建前保存状态。
- 显示:以新配置与新布局继续。
重建 vs 自处理
| 方式 | 优点 | 代价 |
|---|---|---|
| 重建(默认) | 简单、资源自动适配 | 状态要保存恢复、有开销 |
| configChanges 自处理 | 避免重建、响应快 | 要自己处理资源与布局 |
选择依据:变化是否影响布局结构、状态是否难以重建、性能要求。
源码证据
阅读目标:确认配置变化入口。
正文指针:Activity.java onConfigurationChanged()/onSaveInstanceState(); ActivityInfo.java 的 configChanges。
// Activity.java(伪代码,行号以 r75 为准)
public void onConfigurationChanged(Configuration newConfig) {
// configChanges 声明后由系统回调
}这段代码证明: 系统通过重建或回调两种路径处理配置变化;状态保存由 onSaveInstanceState 提供,是连续性的关键。
验证与排障
环境:折叠设备或支持副屏的模拟器。
adb shell dumpsys activity activities | grep -iE "config|bounds"
adb shell settings put global overlay_display_devices 1920,1080,240
adb logcat -v threadtime | grep -E "Configuration|ActivityRecord"先确认配置变化是否被系统识别,再看 Activity 是重建还是回调。状态丢失问题先查 onSaveInstanceState 与 configChanges 配置。
常见误区
- “折叠 = 旋转”:是尺寸等级与显示特征变化。
- “状态丢失无法避免”:保存与恢复可保持连续性。
- “configChanges 万能”:自行处理也要更新资源与布局。
- “只有折叠设备需要适配”:模拟器副屏同样可验证。
延伸问题
- 折叠屏的 display features(铰链区域)如何参与布局?
- onSaveInstanceState 与 ViewModel 如何分工?
- 折叠变化时动画与过渡如何处理?
- 厂商折叠策略与 AOSP 的差异在哪里?
源码入口
| 文件 | 关键位置 | 作用 |
|---|---|---|
Activity.java | onConfigurationChanged() | 配置回调 |
Activity.java | onSaveInstanceState() | 状态保存 |
ActivityInfo.java | configChanges | 声明 |
Configuration.java | 字段 | 配置集合 |
公共路径:frameworks/base/core/java/android/app/ 与 frameworks/base/core/java/android/content/res/。行号以 r75 检索为准。
AOSP 之外的策略差异,见 厂商分屏与大屏定制。