外观
当设备旋转时,Activity 的生命周期如何变化?如何避免不必要的重建?
标准回答
前提是 Activity 正在前台(Resumed),旋转确实引起方向等配置变化,且采用默认重建行为:旧实例 onPause → onStop → onDestroy;新实例 onCreate → onStart → onResume。
**状态保存与恢复插在哪里:**重建时会保存可恢复状态;新实例从 onCreate(savedInstanceState) 取得它,有已保存状态时还会在 onStart 之后、onResume 之前调用 onRestoreInstanceState。onSaveInstanceState 不应背成所有版本固定同一位置:在支持该规则的系统上,targetSdk ≥ 28 时它在 onStop 之后;较早目标版本在 onStop 之前,与 onPause 的先后不固定。
**如何避免这次重建:**若 Activity 在 Manifest 的 android:configChanges 中声明自行处理此次涉及的所有配置变化(横竖屏切换常涉及 orientation|screenSize),系统保留实例并调用 onConfigurationChanged(newConfig)。仅因这次已接管的变化,不会执行上述 onDestroy → onCreate;应用需要自行更新受影响的布局和资源。
**哪些情况不按这条顺序:**物理旋转没有改变 Activity 的配置时,不会仅因转动设备就重建;若还有未接管的配置变化,仍可能重建。ViewModel 和状态保存用于恢复数据,不会阻止重建;新实例也不走旧实例“重新启动”的 onRestart。
通俗例子
竖屏表单填了一半后旋转:旧 Activity 被销毁,新 Activity 创建。输入内容放入可恢复状态,业务数据由 ViewModel 管理,才能避免“页面换了,内容没了”。
深入解释
**为什么要重建:**旋转后宽高、资源配置可能改变。重建会创建新的 Activity 和 View,让资源系统重新选布局;它不是把原来的 View 简单转个方向。
**哪些数据放哪里:**正在加载的业务数据可放 ViewModel;选中项、输入等小状态可用 savedInstanceState 或 SavedStateHandle。需要长期保留的草稿放数据库,因为 ViewModel 本身不能跨进程死亡保留。
易混淆点
ViewModel 本身不能跨进程死亡保存数据。不要为省一次重建就把所有 configChanges 都声明上。
参考资料
内容来源
- Android · AI Agent 知识手册 · 原条目
1.1.2