Android Activity生命周期全解析:从回调机制到现代架构

276 阅读4分钟

一句话总结:

Activity 的生命周期就像一家店铺的“营业流程”,从开店到关店,不同阶段要做不同的事(比如摆货、迎客、打扫),系统会通过“电话通知”(回调方法)告诉你店铺状态的变化。


一、核心模型:状态(State)与回调(Callback)的双重奏

理解生命周期,要同时关注两个维度:

  1. 生命周期状态:Activity在任何时刻所处的稳定状态。共五种:INITIALIZED, CREATED, STARTED, RESUMED, DESTROYED
  2. 生命周期事件/回调:当状态发生切换时,系统调用的通知方法。

这个模型告诉我们,不应只关注回调本身,而应理解哪个回调将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瞬时状态的机制。
  1. onSaveInstanceState(Bundle outState)

    • 触发时机:在onStop()之前,当系统预知Activity可能被销毁时调用。
    • 作用:让你有机会将UI的临时状态(如滚动位置、输入文本)存入一个Bundle对象中。
  2. 恢复状态 (onCreate(Bundle savedInstanceState)onRestoreInstanceState(Bundle savedInstanceState))

    • onCreate() : 重建时,onSaveInstanceState保存的Bundle会作为savedInstanceState参数传递进来。这是最常见的恢复位置。
    • onRestoreInstanceState() : 在onStart()之后调用,提供另一个恢复时机。

核心区别onPause()/onStop()用于保存永久性数据(用户希望永远保留的数据),而onSaveInstanceState用于保存临时UI状态(用户希望在旋转屏幕后依然保留的状态)。


四、现代化的生命周期管理:拥抱Jetpack Lifecycle

手动在每个回调中管理资源既繁琐又容易出错。为此,Google推出了Jetpack Lifecycle库,让组件能够自我管理生命周期

  • 核心组件

    • LifecycleOwner:一个具有生命周期的对象(ActivityFragment都默认实现了它)。
    • 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不再需要在其onResumeonPause中手动调用startPlaybackpausePlaybackMyMusicPlayer组件实现了高内聚,自我管理其与生命周期相关的行为,代码更清晰、更安全。

ViewModelLiveData 更是基于此机制构建,ViewModel能在配置变更中存活,LiveData则能自动在Activity不活跃时停止数据更新,这都是现代Android开发的基石。