最原始的问题
Android 里一个页面就是一个 Activity。系统会在不同时机调用它的方法:
class VideoActivity : Activity() {
override fun onCreate() { /* 页面创建 */ }
override fun onResume() { /* 用户看到了,可以交互 */ }
override fun onPause() { /* 用户要走了 */ }
override fun onDestroy() { /* 页面销毁 */ }
}这些方法是系统自动调的,你不用自己调。用户打开页面,系统就帮你调onCreate → onStart → onResume。
场景:播放器要跟着页面状态走
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