一句话总结:
Activity 的生命周期就像一家店铺的“营业流程”,从开店到关店,不同阶段要做不同的事(比如摆货、迎客、打扫),系统会通过“电话通知”(回调方法)告诉你店铺状态的变化。
一、核心模型:状态(State)与回调(Callback)的双重奏
理解生命周期,要同时关注两个维度:
- 生命周期状态:Activity在任何时刻所处的稳定状态。共五种:
INITIALIZED,CREATED,STARTED,RESUMED,DESTROYED。 - 生命周期事件/回调:当状态发生切换时,系统调用的通知方法。
这个模型告诉我们,不应只关注回调本身,而应理解哪个回调将Activity带入了哪个状态。
二、生命周期回调的职责划分(配对解析)
1. 完整生命周期: onCreate() vs onDestroy()
-
范围:从Activity首次创建到最终销毁。
-
onCreate(): 仅调用一次。负责全局性、一次性的初始化工作,如:setContentView()加载布局。- 初始化ViewModel、绑定控件(ViewBinding/DataBinding)。
- 注入依赖(Dagger/Hilt)。
-
onDestroy(): 最终释放所有资源,回收内存。
2. 可见生命周期: onStart() vs onStop()
- 范围:Activity对用户可见的整个时间段。
onStart(): Activity即将变得可见。适合启动或恢复与UI相关的、非独占性的资源,如注册广播接收器、启动UI动画。onStop(): Activity完全不可见。适合释放UI相关资源,以及执行一些较重的保存操作(如写入数据库)。
3. 前台生命周期: onResume() vs onPause()
-
范围:Activity位于前台,并能与用户进行交互的时间段。
-
onResume(): Activity获得焦点,进入可交互状态。适合启动或恢复独占性的系统资源,如:- 打开相机、开始录音。
- 启动传感器监听。
-
onPause(): Activity失去焦点,即将进入后台或被部分遮挡(如被一个对话框式的Activity覆盖)。此方法必须迅速执行完毕,因为它会阻塞下一个Activity的显示。适合:- 保存未提交的持久化数据(如表单草稿)。
- 暂停动画、释放相机等独占性资源。
三、意外与重生:onSaveInstanceState与配置变更
这是一个非常关键但常被误解的环节。
- 场景:当系统发生配置变更(如屏幕旋转、语言切换)或因内存不足而回收后台Activity时,系统会先销毁再重建Activity。
- 问题:重建后,用户在界面上的输入(如EditText中的文字、CheckBox的勾选状态)会丢失。
- 解决方案:系统提供了一套专门用于保存和恢复UI瞬时状态的机制。
-
onSaveInstanceState(Bundle outState):- 触发时机:在
onStop()之前,当系统预知Activity可能被销毁时调用。 - 作用:让你有机会将UI的临时状态(如滚动位置、输入文本)存入一个
Bundle对象中。
- 触发时机:在
-
恢复状态 (
onCreate(Bundle savedInstanceState)或onRestoreInstanceState(Bundle savedInstanceState)) :onCreate(): 重建时,onSaveInstanceState保存的Bundle会作为savedInstanceState参数传递进来。这是最常见的恢复位置。onRestoreInstanceState(): 在onStart()之后调用,提供另一个恢复时机。
核心区别:onPause()/onStop()用于保存永久性数据(用户希望永远保留的数据),而onSaveInstanceState用于保存临时UI状态(用户希望在旋转屏幕后依然保留的状态)。
四、现代化的生命周期管理:拥抱Jetpack Lifecycle
手动在每个回调中管理资源既繁琐又容易出错。为此,Google推出了Jetpack Lifecycle库,让组件能够自我管理生命周期。
-
核心组件:
LifecycleOwner:一个具有生命周期的对象(Activity和Fragment都默认实现了它)。LifecycleObserver:一个观察者,可以监听LifecycleOwner的生命周期变化。
示例:创建一个生命周期感知的播放器
class MyMusicPlayer(lifecycle: Lifecycle) : DefaultLifecycleObserver {
init {
lifecycle.addObserver(this) // 将自己注册为观察者
}
// 当LifecycleOwner(如Activity)进入onResume状态时,此方法自动被调用
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
startPlayback()
}
// 当LifecycleOwner(如Activity)进入onPause状态时,此方法自动被调用
override fun onPause(owner: LifecycleOwner) {
super.onPause(owner)
pausePlayback()
}
fun release() {
lifecycle.removeObserver(this)
// ...释放播放器资源
}
}
// 在Activity中
class MainActivity : AppCompatActivity() {
private lateinit var musicPlayer: MyMusicPlayer
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 创建播放器,并将Activity的生命周期(this.lifecycle)传递给它
musicPlayer = MyMusicPlayer(this.lifecycle)
}
}
优势:MainActivity不再需要在其onResume和onPause中手动调用startPlayback和pausePlayback。MyMusicPlayer组件实现了高内聚,自我管理其与生命周期相关的行为,代码更清晰、更安全。
ViewModel 和 LiveData 更是基于此机制构建,ViewModel能在配置变更中存活,LiveData则能自动在Activity不活跃时停止数据更新,这都是现代Android开发的基石。