Jetpack Lifecycle 核心机制与源码深度解析
一、引言
Android Jetpack 系列组件推出已有一段时间,作为架构组件的基础设施,它使得开发过程更加规范化。遵循谷歌推荐的最佳实践不仅能让 App 更加健壮、体验更优,还能在代码层面实现简洁优雅,消除冗余的样板代码。
Lifecycle 是 Jetpack 的基石之一,用于生命周期感应型组件的构建。它允许其他对象根据 Activity 或 Fragment 的生命周期状态自动调整自身行为。本文将系统梳理 Lifecycle 的核心概念、依赖配置、管理重要性以及源码实现细节,帮助开发者深入理解其工作原理。
二、Lifecycle 是什么?
Lifecycle 是一个抽象类,用于存储有关组件(Activity、Fragment)的生命周期状态信息,并允许其他对象观察此状态。通过 Lifecycle,我们可以解耦业务逻辑与生命周期回调,避免内存泄漏和状态不一致问题。
1. 核心枚举:事件与状态
Lifecycle 使用两种主要的枚举来跟踪相关组件的生命周期状态:
- Events(事件):从框架和类分派的生命周期事件。这些事件映射到 Activity 和 Fragment 中的回调事件,如
ON_CREATE,ON_START,ON_RESUME等。 - States(状态):由 Lifecycle 对象跟踪的组件的当前状态。包括
INITIALIZED,CREATED,STARTED,RESUMED,DESTROYED。
官方结构图展示了状态流转关系,通常是从 INITIALIZED 开始,经过 CREATED, STARTED, RESUMED,最终到达 DESTROYED。
三、依赖配置
早期的依赖 lifecycle-extensions 已弃用。现在建议为特定 Lifecycle 工件添加所需的依赖项。以下是推荐的 Gradle 配置:
dependencies {
val lifecycle_version = "2.6.0"
// 基础运行时,不包含 ViewModel 或 LiveData
implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version")
// ViewModel (可选)
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version")
// LiveData (可选)
implementation("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version")
}
一般在使用 Lifecycle 时,都会搭配 ViewModel、LiveData 一起使用,构建数据驱动 UI 型应用。循序渐进地掌握 Lifecycle 有助于深刻理解 Android 架构组件。
四、生命周期的管理重要性
Android 中的内存泄漏问题很大一部分来源于对生命周期的管理不当。资源在本应该释放的时候并没有得到释放,导致生命周期短的组件持有了生命周期长的组件,最终导致内存泄漏甚至应用 Crash。
例如,自定义 View 包含动画时,需要在 onPause 时暂停动画;Handler 需要回收消息的移除等,这些都与生命周期紧密关联。
1. 传统方式的局限性
官方的使用 Demo 展示了获取定位信息的场景:在 App 启动时开启获得定位的信息对应 ,而在 对资源进行释放。


