Skip to content
阅读进度

当设备旋转时,Activity 的生命周期如何变化?如何避免不必要的重建? ​

返回 Android 核心 目录

标准回答 ​

前提是 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 都声明上。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。