Lifecycle源碼分析
目錄介紹
- 01.Lifecycle的作用是什么
- 02.Lifecycle的簡單使用
- 03.Lifecycle的使用場景
- 04.如何實現生命周期感知
- 05.注解方法如何被調用
- 06.addObserver調用分析
- 07.知識點梳理和總結一下
00.使用AAC實現bus事件總線
- 利用LiveData實現事件總線,替代EventBus。充分利用了生命周期感知功能,可以在activities, fragments, 或者 services生命周期是活躍狀態時更新這些組件。支持發送普通事件,也可以發送粘性事件;還可以發送延遲消息,以及輪訓延遲消息等等。
- https://github.com/yangchong211/YCLiveDataBus
01.Lifecycle的作用是什么
- Lifecycle 是一個專門用來處理生命周期的庫,它能夠幫助我們將 Activity、Fragment 的生命周期處理與業務邏輯處理進行完全解耦,讓我們能夠更加專注於業務;通過解耦讓 Activity、Fragment 的代碼更加可讀可維護。
02.Lifecycle的簡單使用
- 直接看一下下面的案例,用法十分簡單,代碼如下
- 可以通過 getLifecycle() 方法拿到 Lifecycle, 並添加 Observer 來實現對 Activity 生命周期的監聽。
- 然后打印日志記錄如下所示
- 可以發現Lifecycle是可以監聽activity的生命周期的。
- 在activity創建的時候,activity中生命周期onCreate方法優先LifecycleObserver中onCreate方法先執行;關閉的時候相反!
03.Lifecycle的使用場景
- Lifecycle 的應用場景非常廣泛,我們可以利用 Lifecycle 的機制來幫助我們將一切跟生命周期有關的業務邏輯全都剝離出去,進行完全解耦。
- 比如視頻的暫停與播放,
- Handler 的消息移除,
- 網絡請求的取消操作,
- Presenter 的 attach&detach View
- 暫停和恢復動畫繪制
- 並且可以以一個更加優雅的方式實現,還我們一個更加干凈可讀的 Activity & Fragment。
- 關於網絡請求的取消操作
- 停止和開啟視頻緩沖
- 使用支持生命周期的組件盡快開始視頻緩沖,但是將播放推遲到應用程序完全啟動。 還可以使用可識別生命周期的組件在應用程序銷毀時終止緩沖。
- 啟動和停止網絡連接
- 使用可感知生命周期的組件可以在應用程序處於前台狀態時實時更新(流式傳輸)網絡數據,並在應用程序進入后台時自動暫停。
- 暫停和恢復動畫繪制
- 當應用程序在后台運行時,使用生命周期感知組件處理暫停動畫繪制,並在應用程序在前台運行后恢復繪制。
04.如何實現生命周期感知
- 看到上面的簡單案例,可以發現使用了注解@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)標注的方法,既可以執行生命周期的監聽。
- 那么追蹤到Lifecycle.Event類,看看還有哪里使用到了該注解,截圖如下所示,這里我們就先看一下ReportFragment類,看上去應該跟Fragment有關系!
4.1 生命周期事件與狀態
- 上面案例中使用到了注解,那么它究竟有那些狀態呢?
- Lifecycle是一個抽象類,里面主要有兩個功能,一個是Event生命周期,一個是State狀態。
- Lifecycle.Event表示生命周期的狀態,與 Activity 生命周期類似。
- Lifecycle.State表示當前組件的生命周期狀態,
- Event 與 State 的關系(摘自網絡)
4.2 ReportFragment類分析
- 源碼如下所示,這里只是摘取了部分和生命周期有關的源代碼。
- 重寫了生命周期回調的方法,可以看到生命周期方法中調用了dispatch(Lifecycle.Event.XXX),是這個 ReportFragment 在發揮作用。
- Lifecycle 利用了 Fragment 來實現監聽生命周期,並在最終利用 dispatch 的方法來分發生命周期事件。
- 在Fragment生命周期發生變化時調用dispatch方法來分發生命周期,在里面調用了LifecycleRegistry的handleLifecycleEvent方法。
- 然后再來看一下哪里用到了這個ReportFragment類,具體追蹤到LifecycleDispatcher中的DispatcherActivityCallback內部類中的onActivityCreated方法,源碼如下所示
- 接着看一下handleLifecycleEvent(event)源碼代碼,可以發現根據Event狀態來獲取State狀態,然后分發狀態。后續還會分析到……
4.3 ComponentActivity類分析
- fragment需要依賴宿主activity。通過搜索ReportFragment.injectIfNeededIn調用地方,發現 ComponentActivity 調用了該方法。(API 28 以下的版本是 SupportActivity )
- 內部創建了一個 LifecycleRegistry 成員對象,並且該ComponentActivity類實現了 LifecycleOwner 。
- 在 onCreate 方法里 調用了 ReportFragment.injectIfNeededIn(this); 注入了 ReportFragment。通過getLifecycle可以獲取mLifecycleRegistry對象!
- Lifecycle是一個抽象類,LifecycleRegistry是它的實現子類,主要是管理Observer,
05.注解方法如何被調用
- OnLifecycleEvent 注解:
- 看到有 RetentionPolicy.RUNTIME 修飾,表示運行時注解,在運行時通過反射去識別的注解。
- 運行時注解一般和反射機制配合使用,相比編譯時注解性能比較低,但靈活性好,實現起來比較簡單。
- 之前在了解完生命周期監聽的原理的同時,我們也看到了生命周期事件的接收者 LifecycleRegistry ,是它的 handleLifecycleEvent() 接收了事件,我們繼續追蹤。
- 其實從方法注釋就能看出來了,就是它處理了狀態並通知了 observer 。看下 getStateAfter() 方法:
- getStateAfter() 這個方法根據當前 Event 獲取對應的 State ,細看其實就是 【2.3.3】中那個圖的代碼實現。
- 接下去看 sync() 方法:
- sync 方法里對比了當前 mState 以及上一個 State ,看是應該前移還是后退,這個對應了生命周期的前進跟后退,打個比方就是從 onResume -> onPause (forwardPass),onPause -> onResume (backwardPass),拿 backwardPass() 舉例吧。(forwardPass方法處理類似)
- 通過源碼可以看到, backwardPass() 方法調用 downEvent 獲取往回退的目標 Event。可能比較抽象,舉個例子,在 onResume 的狀態,我們按了 home,這個時候就是 RESUMED 的狀態變到 STARTED 的狀態,對應的要發送的 Event 是 ON_PAUSE,這個就是 backwardPass() 的邏輯了。如果前面的代碼都是引子的話,最終看到了一絲分發的痕跡了—— observer.dispatchEvent(lifecycleOwner, event)。
- 可以看到最后調用了 GenericLifecycleObserver.onStateChanged() 方法,再跟。
- 這個類的代碼比較多,不過也不復雜。可以看到最后代碼走到了invokeCallback() ,通過反射調用了方法。
- 而這個方法是 createInfo() 方法中反射遍歷我們注冊的 Observer 的方法找到的被 OnLifecycleEvent 注解修飾的方法,並且按 Event 類型存儲到了 info.mEventToHandlers 里。
- 在 Observer 用注解修飾的方法,會被通過反射的方式獲取,並保存下來,然后在生命周期發生改變的時候再找到對應 Event 的方法,通過反射來調用方法。
06.addObserver調用分析
- 看一下Lifecycle中addObserver方法,發現它是一個抽象方法,那么就去找它的實現類,這里先來看一下LifecycleRegistry類中的addObserver方法實現代碼
- 然后看一下ObserverWithState類,追溯代碼到Lifecycling.getCallback(observer),看看里面做了什么
- 接着來看看Lifecycling類中getCallback方法
- 判斷該Observer是否是GenericLifecycleObserver,是的話返回本身;如果是FullLifecycleObserver,則直接創建一個FullLifecycleObserverAdapter對象
- 判斷是否包含注解處理器 查找是否包含“類名__LifecycleAdapter”的類 包含並且有OnLifecycleEvent注解則返回SingleGeneratedAdapterObserver/CompositeGeneratedAdaptersObserver
- 如果以上提交都不滿足就通過反射調用回調方法
- 然后查看一下SingleGeneratedAdapterObserver類
- 通過ObserverWithState#dispatchEvent方法最后調用的實際是SingleGeneratedAdapterObserver里面的onStateChanged方法
- 在SingleGeneratedAdapterObserver里面調用了Adapter的callMethods方法
- 這個是
- 然后看一下CompositeGeneratedAdaptersObserver類
- 通過ObserverWithState#dispatchEvent方法最后調用的實際是CompositeGeneratedAdaptersObserver里面的onStateChanged方法
- 在CompositeGeneratedAdaptersObserver里面遍歷mGeneratedAdapters,然后也是調用callMethods方法
- 最后看一下ReflectiveGenericLifecycleObserver類的代碼
- 反射調用回調函數,不過這里聽過class對象,從ClassesInfoCache獲取info信息。先從map里拿,拿不到通過createInfo函數掃描類里面的方法。具體分析可以看源碼……
- 當addObserver的時候最后實際傳入的是一個包裝好的ObserverWithState對象 然后調用onStateChanged方法來分發狀態。使用處理器來提高性能,避免反射造成的性能消耗。
07.知識點梳理和總結一下
- Lifecycle 庫通過在 SupportActivity 的 onCreate 中注入 ReportFragment 來感知發生命周期;
- Lifecycle 抽象類,是 Lifecycle 庫的核心類之一,它是對生命周期的抽象,定義了生命周期事件以及狀態,通過它我們可以獲取當前的生命周期狀態,同時它也奠定了觀察者模式的基調;(我是黨員你看出來了嗎:-D)
- LifecycleOwner ,描述了一個擁有生命周期的組件,可以自己定義,不過通常我們不需要,直接使用 AppCompatActivity 等即可;
- LifecycleRegistry 是Lifecycle的實現類,它負責接管生命周期事件,同時也負責Observer` 的注冊以及通知;
- ObserverWithState ,是 Observer 的一個封裝類,是它最終 通過 ReflectiveGenericLifecycleObserve 調用了我們用注解修飾的方法;
- LifecycleObserver ,Lifecycle 的觀察者,利用它我們可以享受 Lifecycle 帶來的能力;
- ReflectiveGenericLifecycleObserver,它存儲了我們在 Observer 里注解的方法,並在生命周期發生改變的時候最終通過反射的方式調用對應的方法。
參考博客
- https://developer.android.com/topic/libraries/architecture/lifecycle
- https://www.jianshu.com/p/7087f1dae359
- https://mp.weixin.qq.com/s/P22w7K0vS5s0A9M4HkBgzQ
- https://mp.weixin.qq.com/s/xxYoyLXIIr8zHMz9BbpnAg