Android中onSaveInstanceState与android:configChanges配置的区别
Android屏幕旋转适配:两种方案的核心差异
一、onSaveInstanceState/onRestoreInstanceState方案
这是Android官方推荐的标准配置变更处理方式,核心逻辑是让Activity在旋转时销毁重建:
- 系统触发旋转后,会先调用
onSaveInstanceState(Bundle outState),你需要在这里把页面的临时状态(比如输入框文本、列表滚动位置、自定义控件的状态)存入Bundle - 接着Activity被销毁,系统重新创建一个新的Activity实例,调用
onRestoreInstanceState(Bundle savedInstanceState)或在onCreate中读取Bundle,把之前保存的状态恢复回来 - 缺点:如果页面中有对话框、PopupWindow这类依附于Activity的组件,必须手动保存它们的状态(比如是否显示、输入内容),重建后再手动重建这些组件,否则旋转后它们会直接消失,额外工作量大
二、android:configChanges="orientation|screenSize"方案
这是一种“绕过系统默认流程”的处理方式,核心是阻止Activity销毁重建:
- 在AndroidManifest的Activity标签中添加该配置后,系统检测到屏幕旋转时,不会销毁Activity,只会调用
onConfigurationChanged(Configuration newConfig)方法 - 页面的所有状态(包括输入框内容、已显示的对话框、列表位置)都会自动保留,因为Activity实例从始至终都存在
- 注意:如果横竖屏布局有差异,你需要在
onConfigurationChanged里手动处理适配逻辑,比如重新加载布局、调整控件的尺寸或位置
三、核心差异对比
- 生命周期变化:前者会经历完整的销毁重建流程(onDestroy→onCreate);后者Activity实例保持存活,仅触发配置变更回调
- 状态处理成本:前者需要手动编写状态保存和恢复的代码,尤其是对话框等组件;后者无需手动处理状态,所有状态自动保留
- 布局适配方式:前者可以直接利用系统的资源匹配机制(比如在
layout-land目录下放横屏布局),重建时自动加载对应布局;后者需要自己在回调中处理布局切换逻辑 - 兼容性:前者完全遵循系统规范,适配所有Android版本;后者需要注意API版本差异(比如API 13及以上必须同时指定
orientation|screenSize,否则仍会触发销毁重建)
内容的提问来源于stack exchange,提问作者Zhiliand
相关产品推荐
相关产品推荐

