Skip to content
阅读进度

Activity 的生命周期怎样变化? ​

返回 Android 核心 目录

标准回答 ​

Activity 的生命周期需要按场景回答。首次正常启动,依次是 onCreate、onStart、onResume,分别对应创建、进入可见状态和进入可交互的生命周期状态;但 onResume 不等于像素已上屏,也不等于一定获得输入焦点。

从正在使用的页面切到后台,典型过程是 onPause、onStop。如果同一个实例仍存在,再回到前台通常是 onRestart、onStart、onResume。若只是被一个半透明页面遮住,原页面仍可见,则可能只进入暂停状态,不一定执行 onStop。

对处于前台的实例,正常 finish 常见过程是 onPause、onStop、onDestroy。按返回的具体结果还取决于页面位置、系统版本和导航处理:例如 Android 12 及以后的根启动页默认返回可以把任务放到后台,而非销毁。系统直接杀掉进程时,也不保证先调用 onDestroy。

默认需要重建的旋转等配置变化中,旧前台实例通常执行 onPause、onStop、onDestroy,新实例执行 onCreate、onStart、onResume。状态保存与恢复回调也会参与,但不能把旋转解释成固定重启整个进程。ViewModel 可跨同一作用域的配置重建保留状态;进程死亡后的恢复则需要已保存状态或持久数据。

关键机制 ​

  • 按返回并正常结束:通常是 onPause → onStop → onDestroy。进程被系统直接终止时,不保证执行 onDestroy。
  • 默认发生需要重建的配置变化时:旧实例 onPause → onStop → onDestroy;新实例 onCreate → onStart → onResume。状态保存回调也参与,但顺序受版本影响。
  • ViewModel 保存跨配置变化的页面状态;SavedStateHandle / onSaveInstanceState 保存适量可恢复状态;需要长期保存的数据写入数据库或文件。

通俗例子 ​

设备旋转后列表不应重新从空白开始:列表状态由 ViewModel 持有,位置等小状态可保存恢复。发生进程重建时,原 ViewModel 对象已经不存在,需要从保存状态或持久层重新构建。

追问与回答 ​

旋转后为什么又走 onCreate? ​

默认情况下,系统通过重建 Activity 让它重新读取适合当前方向、尺寸等条件的资源,所以新的页面实例会执行 onCreate。若应用声明处理某类 configChanges,相关变化可能改走 onConfigurationChanged,但这要求自己正确更新界面,也不能阻止所有种类的重建。

onStop 之后是不是只能等 onDestroy? ​

不是。同一个停止状态的实例可以重新进入前台,典型回调为 onRestart、onStart、onResume;也可能后来被正常销毁,或者所在进程直接被系统终止。onStop 表示页面进入停止状态,不是宣告对象必然马上销毁。

易混淆点 ​

可见不等于获得焦点。多窗口中非前台焦点页面仍可能可见;配置了 configChanges 也不意味着所有变化都不会重建。

参考资料 ​

内容来源 ​

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