在 Jetpack 架构中,ComponentActivity 是承载所有生命周期感知功能和现代 UI 交互模式的基石。
首先,我们必须明确其在 Activity 家族中的核心地位:
android.app.Activity
└── androidx.core.app.ComponentActivity
└── androidx.activity.ComponentActivity
└── androidx.fragment.app.FragmentActivity
└── androidx.appcompat.app.AppCompatActivity
当你使用最常见的 AppCompatActivity 时,你已经继承了 ComponentActivity 提供的所有现代化功能。
ComponentActivity 的主要职责是实现一系列 ...Owner 接口,将自身转变为一个功能丰富的“宿主”或“提供者”:
LifecycleOwner: 使 Activity 具备生命周期,能被其他组件观察。ViewModelStoreOwner: 提供 ViewModel 的存储和管理能力,使其能在配置变更后存活。SavedStateRegistryOwner: 提供 Jetpack SavedState 机制,用于UI状态的保存与恢复。OnBackPressedDispatcherOwner: 提供可组合的、生命周期感知的返回键处理机制。Lifecycle: 一个抽象类,用于持有组件(如 Activity)的生命周期状态 (State) 和事件 (Event) 信息。它是生命周期这个“概念”的模型。
LifecycleOwner: 一个接口,只有一个 getLifecycle() 方法。ComponentActivity 实现了这个接口,意味着它“拥有”并能向外提供一个 Lifecycle 对象。
LifecycleRegistry: Lifecycle 类的具体实现。ComponentActivity 内部持有一个 LifecycleRegistry 实例。它像一个引擎,负责:
State。LifecycleObserver 的列表。ComponentActivity 如何知道该在何时通知 LifecycleRegistry 发生了生命周期事件(如 ON_CREATE, ON_START)?答案就在 ReportFragment 这个设计精妙的兼容层中。
在 ComponentActivity 的 onCreate 方法中,会执行一行至关重要的代码:
ReportFragment.injectIfNeededIn(this);
这行代码是连接 Android 框架原生生命周期与 Jetpack Lifecycle 模型的桥梁。ReportFragment 的行为是动态的,它根据设备的 API 级别采用不同的策略:
在旧版 Android 系统上,没有可靠的 API 能让一个外部库精确捕获 Activity 的所有生命周期事件。因此,ReportFragment 采用以下策略:
ReportFragment 实例。FragmentManager 将其附加到当前 Activity 上。Activity 完全同步。在其自身的 onStart(), onStop() 等回调方法中,它会捕获这些事件,并立即调用 LifecycleRegistry 的方法来分发对应的 Jetpack Lifecycle.Event。ActivityLifecycleCallbacks从 Android 10 开始,Activity 类提供了 registerActivityLifecycleCallbacks API,它允许以回调的方式精确地监听生命周期。因此,ReportFragment 的策略变为:
ReportFragment 内部封装的一个静态 Application.ActivityLifecycleCallbacks 实现。activity.registerActivityLifecycleCallbacks() 将这个回调注册到 Activity 上。此后,该回调对象将负责监听并转发所有生命周期事件。通过这种方式,ReportFragment 类作为一个统一的入口,内部巧妙地封装了两种不同的实现,为上层 ComponentActivity 提供了完全一致的调用接口,完美地解决了向后兼容性问题。
一旦 Lifecycle 机制建立起来,其他组件就可以作为观察者来感知生命周期了。
LifecycleObserver: 一个标记接口(或通过实现 DefaultLifecycleObserver),允许任何类通过注解或接口方法接收生命周期事件。
class MyLocationObserver : DefaultLifecycleObserver {
override fun onResume(owner: LifecycleOwner) { /* 连接 GPS */ }
override fun onPause(owner: LifecycleOwner) { /* 断开 GPS */ }
}
// 在 Activity 中:
lifecycle.addObserver(MyLocationObserver())
LiveData: 一个更高级的、可感知生命周期的数据持有者。它不仅是一个观察者,更是一个管理者。
liveData.observe(lifecycleOwner, observer) 时,LiveData 内部会创建一个与 lifecycleOwner 绑定的观察者。lifecycleOwner 的状态。只有当其处于活跃状态(STARTED 或 RESUMED)时,LiveData 才会将数据更新通知给 observer。lifecycleOwner 被销毁 (DESTROYED) 时,LiveData 会自动移除对应的观察者,彻底杜绝内存泄漏。以下是所有组件如何协同工作的完整流程:
总结:
ComponentActivity 是实现 LifecycleOwner 的核心宿主。onCreate() 中调用 ReportFragment 的静态方法来启动生命周期监听。ReportFragment 是一个兼容性适配器,根据 API 版本决定是注入 Fragment 还是注册 Callback 来捕获系统事件。LifecycleRegistry,后者是管理生命周期状态和观察者的引擎。LifecycleRegistry 将事件分发给所有观察者,如自定义的 LifecycleObserver 和 LiveData。LiveData 在此基础上增加了额外的安全层,确保只在 UI 活跃时才进行数据更新,从而构建出安全、可靠、解耦的现代化 Android 应用。