androidx.lifecycle 生命周期感知型組件實現(xiàn)原理

概述

androidx.lifecycle 組件用來感知另一個組件如 Activity 和 Fragment 的生命周期變化,方便在生命周期變更時處理一些事情。


lifecycle 邏輯

其邏輯簡單來說就是:使用者向 LifecycleRegistry 注冊一個 LifecycleObserver ,當(dāng) LifecycleOwner(一般由 Activity 和 Fragment 實現(xiàn))發(fā)生生命周期變更時,將其變更的 STATE 通知給 LifecycleRegistry ,然后 LifecycleRegistry 將其變更的 EVENT 告知 LifecycleEventObserver ,LifecycleEventObserver 通過 Lifecycling 轉(zhuǎn)換成用戶注冊的 LifecycleObserver 類型并回調(diào)。

可以看到這里面最有趣的就是 LifecycleObserver 的實現(xiàn)方式,這是本篇重點描述的內(nèi)容。

LifecycleObserver

整個 lifecylce 組件最有趣的實現(xiàn)應(yīng)該就是這個 LifecycleObserver ,它是一個空接口。所有實現(xiàn)它的類最后會通過 Lifecycling 轉(zhuǎn)換成它的一個已知實現(xiàn)類 LifecycleEventObserver 。

LifecycleEventObserver

這個框架實現(xiàn)的核心。它定義了一個回調(diào)函數(shù) onStateChanged(owner, event) 。

Lifecycle

我們先回到 Lifecycle 及其實現(xiàn)類 LifecycleRegistry 。


Lifecycle

Lifecycle 定義了 Lifecycle 的 STATE 和 EVENT 。


lifecycle states and events

狀態(tài)和 EVENT 和 Activity 及 Fragment 對應(yīng)。初始狀態(tài)為 INITIALIZED 和 DESTROYED ,定義從初始狀態(tài)到 CREATED 再到 STARTED 再到 RESUMED 為狀態(tài)上升,相反為狀態(tài)下降。

Lifecycle 存儲了 Activity 、Fragment 的生命周期狀態(tài),并方便其它對象跟蹤。LifecycleRegistry 是其實現(xiàn)類,它允許多個對象同時跟蹤生命周期狀態(tài)(通過 LifecycleObserver)。

GeneratedAdaptersObserver

上面說到可以向 LifecycleRegistry 注冊任意實現(xiàn)的 LifecycleObserver ,然后 LifecycleRegistry 會通過 Lifecycling 轉(zhuǎn)換成 LifecycleEventObserver 去監(jiān)聽,說到變更時再轉(zhuǎn)換回自定義 LifecycleObserver 中的回調(diào)方法。那么是怎么實現(xiàn)的呢?

這個框架中定義了兩個實現(xiàn)方式,一種通過自定義的 adater ,另外一種為反射。

通過 adapter 的方法其實原理很簡單,就是自定義 LifecycleObserver 時同時自定義一個 adapter ,這個 adapter 需要自己實現(xiàn)將 LifecycleEventObserver 中回調(diào)的狀態(tài)轉(zhuǎn)換成 observer 中回調(diào)的方法。

這個 adapter 需要在 LifecycleObserver 同級的 pkg 下面且名為 LifecycleAdapter ,其父類或其本身繼承自 GeneratedAdapter ,并有構(gòu)造函數(shù) LifecycleAdapter(LifecyelObserver)。

Lifecycling 在轉(zhuǎn)換時將為這種類型的 observer 創(chuàng)建一個 SingleGeneratedAdapterObserver 或 CompositeGeneratedAdaptersObserver ,并傳入自定義的 GeneratedAdapter 實現(xiàn)類。因為這個 XXXGeneratedAdapterObserver 實現(xiàn)了 LifecycleEventObserver ,所以在其收到 onStateChange 回調(diào)時只需調(diào)用 GeneratedAdapter #callMethods ,剩下交給 adapter 自己去實現(xiàn)狀態(tài)與回調(diào)的轉(zhuǎn)換。

GeneratedAdaptersObserver

ReflectiveGenericLifecycleObserver

如果不想自定義 GeneratedAdapter 的實現(xiàn)類可以嗎,可以。這個框架還實現(xiàn)了反射回調(diào)機制。只要你在自定義 LifecycleObserver 時給回調(diào)函數(shù)加上 @OnLifecycleEvent(Lifecycle.Event xxx) 的注釋,Lifecycling 會幫你創(chuàng)建一個 ReflectiveGenericLifecycleObserver 并傳入 observer 對象,這個 ReflectiveGenericLifecycleObserver 實現(xiàn) LifecycleEventObserver ,并通過反射機制取出并緩存所有按規(guī)則加上了 @OnLifecycleEvent 注釋的方法,在收到 onStateChange 時取出對應(yīng) event 的反射方法,并回調(diào)。


ReflectiveGenericLifecycleObserver

可以看到其核心實現(xiàn)在 CallbackInfo ,其緩存了 observer 對象中的 [event, 反射方法 list] map ,在收到 lifecycle 變更時,取出對應(yīng) event 的所有反射方法 list 并回調(diào)就行。

Lifecycling

Lifecycling 可以說是整個實現(xiàn)的精髓了,它在 LifecycleObserver 注冊時將其轉(zhuǎn)換成 LifecycleEventObserver 的 adapter 或 reflect 實現(xiàn)類。


Lifecycling

總結(jié)

一般來說,我們使用 LifecycleEventObserver 就行,雖然這個框架通過復(fù)雜的實現(xiàn)可以讓你隨意(其實還是有條件)的定義自己要的 LifecycleObserver ,但似乎也不是很有實際用途?

參考:

android developers:使用生命周期感知型組件處理生命周期

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容