androidx.lifecycle 生命周期感知型组件实现原理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了androidx.lifecycle 生命周期感知型组件实现原理相关的知识,希望对你有一定的参考价值。
参考技术A androidx.lifecycle 组件用来感知另一个组件如 Activity 和 Fragment 的生命周期变化,方便在生命周期变更时处理一些事情。其逻辑简单来说就是:使用者向 LifecycleRegistry 注册一个 LifecycleObserver ,当 LifecycleOwner(一般由 Activity 和 Fragment 实现)发生生命周期变更时,将其变更的 STATE 通知给 LifecycleRegistry ,然后 LifecycleRegistry 将其变更的 EVENT 告知 LifecycleEventObserver ,LifecycleEventObserver 通过 Lifecycling 转换成用户注册的 LifecycleObserver 类型并回调。
可以看到这里面最有趣的就是 LifecycleObserver 的实现方式,这是本篇重点描述的内容。
整个 lifecylce 组件最有趣的实现应该就是这个 LifecycleObserver ,它是一个空接口。所有实现它的类最后会通过 Lifecycling 转换成它的一个已知实现类 LifecycleEventObserver 。
这个框架实现的核心。它定义了一个回调函数 onStateChanged(owner, event) 。
我们先回到 Lifecycle 及其实现类 LifecycleRegistry 。
Lifecycle 定义了 Lifecycle 的 STATE 和 EVENT 。
状态和 EVENT 和 Activity 及 Fragment 对应。初始状态为 INITIALIZED 和 DESTROYED ,定义从初始状态到 CREATED 再到 STARTED 再到 RESUMED 为状态上升,相反为状态下降。
Lifecycle 存储了 Activity 、Fragment 的生命周期状态,并方便其它对象跟踪。LifecycleRegistry 是其实现类,它允许多个对象同时跟踪生命周期状态(通过 LifecycleObserver)。
上面说到可以向 LifecycleRegistry 注册任意实现的 LifecycleObserver ,然后 LifecycleRegistry 会通过 Lifecycling 转换成 LifecycleEventObserver 去监听,说到变更时再转换回自定义 LifecycleObserver 中的回调方法。那么是怎么实现的呢?
这个框架中定义了两个实现方式,一种通过自定义的 adater ,另外一种为反射。
通过 adapter 的方法其实原理很简单,就是自定义 LifecycleObserver 时同时自定义一个 adapter ,这个 adapter 需要自己实现将 LifecycleEventObserver 中回调的状态转换成 observer 中回调的方法。
这个 adapter 需要在 LifecycleObserver 同级的 pkg 下面且名为 LifecycleAdapter ,其父类或其本身继承自 GeneratedAdapter ,并有构造函数 LifecycleAdapter(LifecyelObserver)。
Lifecycling 在转换时将为这种类型的 observer 创建一个 SingleGeneratedAdapterObserver 或 CompositeGeneratedAdaptersObserver ,并传入自定义的 GeneratedAdapter 实现类。因为这个 XXXGeneratedAdapterObserver 实现了 LifecycleEventObserver ,所以在其收到 onStateChange 回调时只需调用 GeneratedAdapter #callMethods ,剩下交给 adapter 自己去实现状态与回调的转换。
如果不想自定义 GeneratedAdapter 的实现类可以吗,可以。这个框架还实现了反射回调机制。只要你在自定义 LifecycleObserver 时给回调函数加上 @OnLifecycleEvent(Lifecycle.Event xxx) 的注释,Lifecycling 会帮你创建一个 ReflectiveGenericLifecycleObserver 并传入 observer 对象,这个 ReflectiveGenericLifecycleObserver 实现 LifecycleEventObserver ,并通过反射机制取出并缓存所有按规则加上了 @OnLifecycleEvent 注释的方法,在收到 onStateChange 时取出对应 event 的反射方法,并回调。
可以看到其核心实现在 CallbackInfo ,其缓存了 observer 对象中的 [event, 反射方法 list] map ,在收到 lifecycle 变更时,取出对应 event 的所有反射方法 list 并回调就行。
Lifecycling 可以说是整个实现的精髓了,它在 LifecycleObserver 注册时将其转换成 LifecycleEventObserver 的 adapter 或 reflect 实现类。
一般来说,我们使用 LifecycleEventObserver 就行,虽然这个框架通过复杂的实现可以让你随意(其实还是有条件)的定义自己要的 LifecycleObserver ,但似乎也不是很有实际用途?
android developers:使用生命周期感知型组件处理生命周期
以上是关于androidx.lifecycle 生命周期感知型组件实现原理的主要内容,如果未能解决你的问题,请参考以下文章
无法获取提供者 androidx.lifecycle.ProcessLifecycleOwnerInitializr
在模块中发现问题重复类 androidx.lifecycle.viewmodel
无法解决:androidx.lifecycle:lifecycle-extensions-ktx:2.0.0-alpha1
Flutter 返回 `lifecycle-common-java8.jar (androidx.lifecycle:lifecycle-common-java8:2.0.0)` 错误
找不到接受参数类型 'androidx.lifecycle.LiveData< 的 ~ItemBinding~ 的设置器