最原始的问题

Android 里一个页面就是一个 Activity。系统会在不同时机调用它的方法:

class VideoActivity : Activity() {
 
    override fun onCreate()  { /* 页面创建 */ }
    override fun onResume()  { /* 用户看到了,可以交互 */ }
    override fun onPause()   { /* 用户要走了 */ }
    override fun onDestroy() { /* 页面销毁 */ }
}

这些方法是系统自动调的,你不用自己调。用户打开页面,系统就帮你调onCreateonStartonResume

场景:播放器要跟着页面状态走

class VideoActivity : Activity() {
 
    val player = VideoPlayer()
 
    override fun onResume() {
        player.play()      // 页面可见了,播放
    }
 
    override fun onPause() {
        player.pause()     // 页面不可见了,暂停
    }
 
    override fun onDestroy() {
        player.release()   // 页面销毁了,释放
    }
}

这样写没问题。但如果有很多东西都要跟着生命周期走呢?

class VideoActivity : Activity() {
 
    val player = VideoPlayer()
    val logger = PageLogger()
    val adTracker = AdTracker()
    val downloadManager = DownloadManager()
 
    override fun onResume() {
        player.play()
        logger.startLog()
        adTracker.trackShow()
        downloadManager.resume()
        // ... 越来越多
    }
 
    override fun onPause() {
        player.pause()
        logger.stopLog()
        adTracker.trackHide()
        downloadManager.pause()
        // ... 同样越来越多
    }
}

问题:Activity 变成了一个”大管家”,不仅需要了解各个组件,还要了解各个组件中需要调用的具体方法,每加一个新功能就要改 Activity。

Android 的解决方案:Lifecycle + Observer

Android 从 Jetpack 库开始提供了三个东西:

**1. **Lifecycle— 一个对象,代表”某个页面当前在什么阶段”

// 每个 Activity 天生带一个
val lifecycle: Lifecycle = activity.lifecycle
 
// 它知道当前状态是什么
lifecycle.currentState  // 比如 RESUMED、PAUSED、DESTROYED

**2. **LifecycleObserver— 一个接口,表示”我想监听生命周期变化”

// 这是一个标记接口,表示"我是一个观察者"
interface LifecycleObserver

**3. **LifecycleEventObserver— Observer 的具体版本,带回调方法

interface LifecycleEventObserver : LifecycleObserver {
    // 生命周期变化时,系统会调这个方法
    fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event)
}

用起来就三步

第一步:让你的类实现LifecycleEventObserver

class VideoPlayer : LifecycleEventObserver {
 
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        when (event) {
            ON_RESUME  -> play()
            ON_PAUSE   -> pause()
            ON_DESTROY -> release()
            else -> {}
        }
    }
 
    fun play() { /* 播放 */ }
    fun pause() { /* 暂停 */ }
    fun release() { /* 释放 */ }
}

第二步:在 Activity 里注册

class VideoActivity : AppCompatActivity() {
 
    override fun onCreate() {
        val player = VideoPlayer()
        lifecycle.addObserver(player)   // 就这一行
    }
}

注册完之后,当用户操作导致生命周期变化时:

用户打开页面 → Activity 进入 RESUMED 状态
                → 系统自动调 player.onStateChanged(ON_RESUME)
                    → player 里走到 play()
 
用户按 Home 键 → Activity 进入 PAUSED 状态
                → 系统自动调 player.onStateChanged(ON_PAUSE)
                    → player 里走到 pause()

之前的代码现在变成了

class VideoActivity : AppCompatActivity() {
 
    override fun onCreate() {
        // 每个对象自己知道该干什么,Activity 只管注册
        lifecycle.addObserver(VideoPlayer())
        lifecycle.addObserver(PageLogger())
        lifecycle.addObserver(AdTracker())
        lifecycle.addObserver(DownloadManager())
    }
    
    // onResume/onPause/onDestroy 里不用写任何东西了
}

Activity 不再需要认识每个组件的具体方法,只管把它们注册上去。每个组件自己决定在什么生命周期做什么事。减少了耦合。

更新: 2026-03-07 19:26:40
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/sftr6qxgxmr3nhnc


相关笔记