在 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 应用。