Android Lifecycle 深度解剖:三大类、五种状态、七大事件全面解读!

引言

Android LifecycleJetpack组件库中的一个重要组件,它可以帮助我们更好地管理ActivityFragment等组件的生命周期,从而避免内存泄漏和其他问题。本文将从以下几个方面来介绍Lifecycle的实现原理与使用技巧:

  • Lifecycle的概念与作用
  • Lifecycle的实现原理
  • Lifecycle的使用示例
  • Lifecycle的注意事项与优化技巧

Lifecycle 的概念与作用

LifecycleJetpack组件库中的一个生命周期感知型组件,它可以执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。Lifecycle的核心功能是将组件的生命周期状态通知给观察者,观察者可以根据这些状态变化来执行相应的操作。

例如,我们可以使用Lifecycle来实现以下功能:

  • ActivityFragment销毁时释放资源
  • ActivityFragment处于活跃状态时更新数据
  • ActivityFragment处于暂停状态时暂停某些操作

Lifecycle的核心概念是状态。Lifecycle定义了5种状态:

  1. INITIALIZED: Lifecycle 初始化完成,但 Activity 或 Fragment 还没有被创建。
  2. CREATED: Activity 或 Fragment 已经被创建,但还没有显示出来。
  3. STARTED: Activity 或 Fragment 已经显示出来,但还没有获得焦点。
  4. RESUMED: Activity 或 Fragment 获得焦点,处于活动状态。
  5. DESTROYED: Activity 或 Fragment 被销毁。

而与5种状态对应的是7种事件:

  1. ON_CREATE: 对应onCreate方法
  2. ON_START: 对应onStart方法
  3. ON_RESUME: 对应onResume方法
  4. ON_PAUSE: 对应onPause方法
  5. ON_STOP: 对应onStop方法
  6. ON_DESTROY: 对应onDestroy方法
  7. ON_ANY: 匹配任何事件

状态与事件之间的关系,可以理解为图上对应节点与连接各节点之间的边的关系。

Lifecycle 的实现原理

Lifecycle的实现原理是基于观察者模式,主要依赖于三个类:LifecycleOwnerLifecycleRegistryLifecycleObserver

  1. LifecycleOwner:是一个接口,它表示一个具有生命周期的组件。Activity 和 Fragment 都实现了LifecycleOwner接口。开发者可以通过实现这个接口来监听组件的生命周期变化。
kotlin 复制代码
public interface LifecycleOwner {
    public val lifecycle: Lifecycle
}
  1. LifecycleRegistry:是一个类,它负责管理LifecycleOwner的生命周期状态,并将这些状态通知给已注册的观察者。每个LifecycleOwner都对应一个LifecycleRegistry
kotlin 复制代码
open class LifecycleRegistry private constructor(
    provider: LifecycleOwner,
    private val enforceMainThread: Boolean
) : Lifecycle() {
...
    @MainThread
    @Deprecated("Override [currentState].")
    open fun markState(state: State) {
        enforceMainThreadIfNeeded("markState")
        currentState = state
    }
...
}
  1. LifecycleObserver: 是一个接口,它表示一个可以观察LifecycleOwner生命周期状态的组件。开发人员可以通过实现LifecycleObserver接口来监听LifecycleOwner的生命周期状态变化
kotlin 复制代码
public interface LifecycleObserver

Lifecycle的实现原理如下:

  1. LifecycleOwner在创建时会创建一个Lifecycle实例。
  2. Lifecycle实例本质就是LifecycleRegistry,它会将自己的状态变化通知给所有注册的观察者。
  3. LifecycleObserver在收到状态变化通知后,可以根据状态变化执行相应的操作。

Lifecycle的使用示例

下面是一个简单的使用示例:

kotlin 复制代码
class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 设置生命周期观察者
        lifecycle.addObserver(object : DefaultLifecycleObserver {

	        override fun onCreate(owner: LifecycleOwner) {
	            super.onCreate(owner)
	        }

	        override fun onResume(owner: LifecycleOwner) {
	            super.onResume(owner)
	        }

	        override fun onDestroy(owner: LifecycleOwner) {
	            super.onDestroy(owner)
	        }
	        ...
        })
    }
}

在这个示例中,我们在MyActivity类中设置了一个生命周期观察者。在观察者的onCreate()方法中,我们执行了在Activity创建时要执行的操作。在观察者的onResume()方法中,我们执行了在Activity恢复时要执行的操作。依此类推。

Lifecycle 的注意事项与优化技巧

  • LifecycleOwnerLifecycleObserver之间的关系是单向的。LifecycleOwner可以注册多个观察者,但观察者只能注册一个LifecycleOwner
  • 在使用LifecycleObserver时,需要在组件的生命周期内注册和解除注册LifecycleObserver。否则,LifecycleObserver将无法收到组件的生命周期状态变化的通知。
  • 在Activity或Fragment的生命周期状态变化时,只通知需要收到通知的观察者。
  • 在观察者的方法中,尽量避免执行耗时操作。

结语

Lifecycle是 Android 系统中一个重要的概念,它定义了 Activity 和 Fragment 在其生命周期中的各个状态,以及在每个状态下可以执行的操作。理解Lifecycle的实现原理和使用技巧,对于 Android 开发人员来说非常重要。

推荐

android_startup: 提供一种在应用启动时能够更加简单、高效的方式来初始化组件,优化启动速度。不仅支持Jetpack App Startup的全部功能,还提供额外的同步与异步等待、线程控制与多进程支持等功能。

AwesomeGithub: 基于Github的客户端,纯练习项目,支持组件化开发,支持账户密码与认证登陆。使用Kotlin语言进行开发,项目架构是基于JetPack&DataBinding的MVVM;项目中使用了Arouter、Retrofit、Coroutine、Glide、Dagger与Hilt等流行开源技术。

flutter_github: 基于Flutter的跨平台版本Github客户端,与AwesomeGithub相对应。

android-api-analysis: 结合详细的Demo来全面解析Android相关的知识点, 帮助读者能够更快的掌握与理解所阐述的要点。

daily_algorithm: 每日一算法,由浅入深,欢迎加入一起共勉。

相关推荐
腾讯TNTWeb前端团队2 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰5 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪5 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪5 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy6 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom7 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom7 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom7 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom7 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom7 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试