Android Jetpack架构组件之Lifecycle

611 阅读4分钟

image.png

前言

如何快速高效的掌握一门学问,建议先阅读下这篇文章关于学习的一些看法

一、概述

Lifecycle 是一个生命周期感知型组件,它用于存储有关组件(如 activity 或 fragment)的生命周期状态的信息,并允许其他对象观测此状态

二、设计目的

  • 生命周期感知Lifecycle库旨在提供一种机制,使组件(如ViewModel)能够感知并响应其宿主(如Activity)的生命周期事件,从而避免因生命周期变化引发的内存泄漏、资源浪费等问题。
  • 跨组件通信:通过Lifecycle,组件间可以安全地交换生命周期相关的状态信息,确保数据同步、任务调度等操作在合适的时机进行。

三、关键组件与接口

  • LifecycleOwner:被观察者接口,表示拥有生命周期的组件,如Activity、Fragment等。它提供了getLifecycle()方法,返回一个Lifecycle对象。

  • LifecycleObserver:观察者接口,用于监听LifecycleOwner的生命周期变化。实现此接口的类可以注册到Lifecycle上,当生命周期状态发生变化时,会收到对应的通知。

  • Lifecycle:存储有关组件生命周期状态的信息,使用两种主要枚举跟踪其关联组件的生命周期状态。

    Lifecycle.State:表示生命周期状态,包括INITIALIZED、CREATED、STARTED、RESUMED、DESTROYED。

    Lifecycle.Event:表示生命周期状态的变化事件,如ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP、ON_DESTROY等。

    image.png

    上图构成 Android activity 生命周期的状态和事件

四、实现原理与工作机制

  • 设计模式:状态机模式 + 观察者模式,注解 + 反射 进行解耦

    • 被观察者:LifecycleOwner (Activity/Fragment)

    • 观察者:LifecycleObserver (实现该接口的类)

    • 关联:getLifecycle().addObserver()

  • 状态机模型:Lifecycle内部实现为一个状态机,维护当前生命周期状态。当宿主组件的生命周期事件发生时,Lifecycle会更新其内部状态,并触发相应的LifecycleObserver回调。

  • 观察者注册与通知

    • addObserver(LifecycleObserver):将观察者添加到Lifecycle中。LifecycleRegistry内部使用FastSafeIterableMap存储观察者及其对应的生命周期状态。
    • 状态变化传播:当宿主组件的生命周期事件触发时,LifecycleRegistry会根据事件类型更新状态,并遍历观察者列表,调用观察者的对应方法。例如,当宿主从CREATED变为STARTED时,会调用观察者的onStart()方法。
    • 生命周期状态限制:观察者只能接收到当前及之后的生命周期事件,不会收到已经过去的状态变化。例如,当观察者在RESUMED状态下注册时,不会收到ON_CREATE和ON_START事件。

五、最佳实践与注意事项

  • 使界面控制器(activity 和 fragment)尽可能保持精简。它们不应试图获取自己的数据,而应使用 ViewModel执行此操作,同时应观测 LiveData 对象以在视图中体现相应变化。
  • 设法编写数据驱动型界面,在此类界面中,界面控制器负责随着数据的更改更新视图,或者向 ViewModel通知用户的操作。
  • 将数据逻辑放在 ViewModel 类中。ViewModel 应充当界面控制器与应用其余部分之间的连接器。不过要注意,ViewModel 不负责提取数据(例如,从网络提取)。但是,ViewModel 应调用相应的组件来提取数据,然后将结果提供给界面控制器。
  • 使用 数据绑定 在视图与界面控制器之间维持干净的接口。这样可以让视图更具声明性,并尽量减少需要在 activityfragment 中编写的更新代码。如果您更愿意使用 Java 编程语言来达成此目的,请使用 Butter Knife 之类的库,以避免样板代码并实现更好的抽象化。
  • 如果界面很复杂,不妨考虑创建 presenter 类来处理界面的修改。这可能是一项艰巨的任务,但这样做可使界面组件更易于测试。
  • 避免在 ViewModel中引用 View 或 Activity 上下文。如果 ViewModel 存在的时间比 activity 更长(在配置更改的情况下),activity 将泄漏并且不会获得垃圾回收器的妥善处置。
  • 使用 Kotlin 协程管理长时间运行的任务和其他可以异步运行的操作。

六、扩展与高级特性

  • ProcessLifecycleOwner:提供对整个应用程序生命周期的感知,可用于实现如应用进入后台/前台时的全局行为控制。
  • Lifecycle.Event.ON_ANY:监听所有生命周期事件,常用于需要对生命周期变化做出通用响应的情况。

七、调用时序

  • ComponentActivity -> onCreate()
  • ReportFragment -> inJectIfNeededIn() -> dispatch() -> handleLifecycleEvent()
  • LifecycleRegisty->moveToState -> sync() -> forwardPass()
  • ObserverWithState -> dispatchEvent()
  • ReflectiveGenericLifecycleObserver -> onStateChanged()
  • CallBackInfo -> invokeCallbacks()
  • ClassesInfoCache -> invokeCallback() -> mMethod.invoke()

码字不易,记得关注 + 点赞 + 收藏