androidx.lifecycle 生命周期感知型组件实现原理

概述

androidx.lifecycle 组件用来感知另一个组件如 Activity 和 Fragment 的生命周期变化,方便在生命周期变更时处理一些事情。


lifecycle 逻辑

其逻辑简单来说就是:使用者向 LifecycleRegistry 注册一个 LifecycleObserver ,当 LifecycleOwner(一般由 Activity 和 Fragment 实现)发生生命周期变更时,将其变更的 STATE 通知给 LifecycleRegistry ,然后 LifecycleRegistry 将其变更的 EVENT 告知 LifecycleEventObserver ,LifecycleEventObserver 通过 Lifecycling 转换成用户注册的 LifecycleObserver 类型并回调。

可以看到这里面最有趣的就是 LifecycleObserver 的实现方式,这是本篇重点描述的内容。

LifecycleObserver

整个 lifecylce 组件最有趣的实现应该就是这个 LifecycleObserver ,它是一个空接口。所有实现它的类最后会通过 Lifecycling 转换成它的一个已知实现类 LifecycleEventObserver 。

LifecycleEventObserver

这个框架实现的核心。它定义了一个回调函数 onStateChanged(owner, event) 。

Lifecycle

我们先回到 Lifecycle 及其实现类 LifecycleRegistry 。


Lifecycle

Lifecycle 定义了 Lifecycle 的 STATE 和 EVENT 。


lifecycle states and events

状态和 EVENT 和 Activity 及 Fragment 对应。初始状态为 INITIALIZED 和 DESTROYED ,定义从初始状态到 CREATED 再到 STARTED 再到 RESUMED 为状态上升,相反为状态下降。

Lifecycle 存储了 Activity 、Fragment 的生命周期状态,并方便其它对象跟踪。LifecycleRegistry 是其实现类,它允许多个对象同时跟踪生命周期状态(通过 LifecycleObserver)。

GeneratedAdaptersObserver

上面说到可以向 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 自己去实现状态与回调的转换。

GeneratedAdaptersObserver

ReflectiveGenericLifecycleObserver

如果不想自定义 GeneratedAdapter 的实现类可以吗,可以。这个框架还实现了反射回调机制。只要你在自定义 LifecycleObserver 时给回调函数加上 @OnLifecycleEvent(Lifecycle.Event xxx) 的注释,Lifecycling 会帮你创建一个 ReflectiveGenericLifecycleObserver 并传入 observer 对象,这个 ReflectiveGenericLifecycleObserver 实现 LifecycleEventObserver ,并通过反射机制取出并缓存所有按规则加上了 @OnLifecycleEvent 注释的方法,在收到 onStateChange 时取出对应 event 的反射方法,并回调。


ReflectiveGenericLifecycleObserver

可以看到其核心实现在 CallbackInfo ,其缓存了 observer 对象中的 [event, 反射方法 list] map ,在收到 lifecycle 变更时,取出对应 event 的所有反射方法 list 并回调就行。

Lifecycling

Lifecycling 可以说是整个实现的精髓了,它在 LifecycleObserver 注册时将其转换成 LifecycleEventObserver 的 adapter 或 reflect 实现类。


Lifecycling

总结

一般来说,我们使用 LifecycleEventObserver 就行,虽然这个框架通过复杂的实现可以让你随意(其实还是有条件)的定义自己要的 LifecycleObserver ,但似乎也不是很有实际用途?

参考:

android developers:使用生命周期感知型组件处理生命周期

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容