當前位置:
首頁 > 最新 > 扒一扒 Lifecycle 的實現

扒一扒 Lifecycle 的實現

本文由授權投稿

作者博客:https://jekton.github.io/

Lifecycle 隸屬於 Android 官方架構組件,它的實現跟 ViewModel 類似,都是利用 Fragment 來實現它的功能。通過添加一個 fragment 到 activity 中,這個 fragment 便能夠接收到各個生命周期回調。

以下源碼使用 1.1.1 版本


使用方法簡介

這裡我並不打算講太多 lifecycle 的用法,不熟悉的同學,可以閱讀這篇[1]。

為了使用 lifecycle,首先需要獲取到一個 LifecycleOwner。

使用 support 包時,AppCompatActivity 就是一個 LifecycleOwner。具體的實現是 SupportActivity:

下面,我們就從 SupportActivity 開始分析 lifecycle 組件的實現。


可以看到,在上一節中我們執行 lifecycleOwner.getLifecycle() 返回的就是 mLifecycleRegistry。關於 LifecycleRegistry,我們在下一節再看,這裡先看 ReportFragment。

ReportFragment 就是我們在一開始說的,用於獲取生命周期的 fragment:

ReportFragment 的實現很簡單,讀者自己看看就好。下面我們開始看不那麼好理解的 LifecycleRegistry。


在看代碼前,我們先來了解一下 Lifecycle 的狀態和事件:

Lifecycle.Event 對應 activity 的各個聲明周期,State 則是 Lifecycle 的狀態。在 LifecycleRegistry 中定義了狀態間的轉化關係:

這三個方法,可以總結為下面這樣一張圖:

android-arch-lifecycle-states

downEvent 在圖中表示從一個狀態到他下面的那個狀態,upEvent 則是往上。

了解了 Lifecycle 的狀態後,我們繼續來看 LifecycleRegistry。上一節我們知道,activity 的生命周期發生變化後,會調用到 LifecycleRegistry 的 handleLifecycleEvent:

LifecycleRegistry 本來要做的事其實是很簡單的,但由於他需要執行客戶的代碼,由此引入了很多額外的複雜度。原因是,客戶代碼並不處在我們的控制之下,他們可能做出任何可以做到的事。例如這裡,在回調中又觸髮狀態變化。類似的情況是,在持有鎖的時候不調用客戶代碼,這個也會讓實現變得比較複雜。

接下來我們看 sync():

sync() 的主要作用就是根據把 mObserverMap 里所有元素的狀態都同步為 mState。我們繼續看剩下的 backwardPass/forwardPass:

在看這兩個方法時,可以參考上面的狀態圖。比方說,假設當前隊列里的元素都處於 CREATED。接著收到了一個 ON_START 事件,從圖裡面可以看出,接下來應該是要到 STARTED 狀態。由於 STARTED 大於 CREATED,所以會執行 forwardPass()。forwardPass() 裡面調用 upEvent(observer.mState),返回從 CREATED 往上到 STARTED 需要發送的事件,也就是 ON_START,於是 ON_START 事件發送給了客戶。


註冊 observer 由 addObserver 方法完成:

由於篇幅有限,這裡的 Lifecycling.getCallback 就不看了。簡單提一下,在使用 annotion 的時候,對應的 observer 會生成一個 adapter,這個 adapter 會把對應的 Lifecycle.Event 裝換為方法調用:

註銷 observer 的實現就比較簡單了:

恭喜你,相信你現在對 lifecycle 的實現已經胸有成竹,可以愉快地裝逼了。

附:

[1] https://developer.android.google.cn/topic/libraries/architecture/

— — — END — — —


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 玉剛說 的精彩文章:

Google 跨平台方案 Flutter 從入門到實戰

TAG:玉剛說 |