生命周期敏感的組件:可以和Lifecycle一同工作的類拉馋。
使用示例:
創(chuàng)建生命周期敏感的組件類 LifecycleObserverSample :
如果不是使用 LifecycleActivity 和 LifecycleFragment 淳玩,其他的 Activity 和 Fragment 需要實(shí)現(xiàn)接口 LifecycleRegistryOwner :
主要實(shí)現(xiàn)紅色的部分,其實(shí)這也是 LifecycleActivity 的實(shí)現(xiàn):
例子運(yùn)行效果:
簡(jiǎn)單點(diǎn)說(shuō)辱魁,Activity 和 Fragment 與 生命周期敏感的組件 之間是觀察者和被觀察者的關(guān)系,生命周期敏感的組件 是觀察者,Activity 和 Fragment 是被觀察者肃续,只是 生命周期敏感的組件 并不是直接觀察 Activity 和 Fragment黍檩,而是觀察 LifecycleRegistry ,然后 LifecycleRegistry 再觀察 Activity 和 Fragment 的生命周期始锚。
先總結(jié)一下機(jī)制的基本邏輯:
1.? 利用 ContentProvider 的機(jī)制在應(yīng)用一開(kāi)始就給 Application 注冊(cè) ActivityLifecycleCallbacks刽酱,然后在回調(diào) onActivityCreated() 中給 FragmentActivity類型的Activity 注冊(cè) FragmentLifecycleCallbacks 和給所有的 Activity 注入一個(gè) ReportFragment 的 Fragment,然后在 FragmentLifecycleCallbacks 的 onFragmentCreated() 回調(diào)中對(duì)該 Fragment 注入一個(gè) DestructionReportFragment 類型的子 Fragment瞧捌,然后在 FragmentLifecycleCallbacks 的生命周期回調(diào)和? DestructionReportFragment 的生命周期回調(diào) 和 ReportFragment 的生命周期回調(diào)調(diào)用各自的 LifecycleRegistry 的 handleLifecycleEvent() 處理生命周期事件棵里。這里我的理解是利用 FragmentLifecycleCallbacks 和 DestructionReportFragment 對(duì)Fragment 的生命周期進(jìn)行監(jiān)聽(tīng),利用 ReportFragment 對(duì) Activity 的生命周期進(jìn)行監(jiān)聽(tīng)姐呐。
2. 生命周期敏感的組件 對(duì)實(shí)現(xiàn)了 LifecycleRegistryOwner 的 Activity 和 Fragment 的 getLifecycle() 返回的 LifecycleRegistry 類型的實(shí)例進(jìn)行觀察殿怜。
3. 當(dāng) Activity 和 Fragment 生命周期發(fā)生變化時(shí),該 Activity 和 Fragment 的 LifecycleRegistry 實(shí)例會(huì)調(diào)用對(duì)其進(jìn)行觀察的所有 生命周期敏感的組件 的相應(yīng)事件的處理函數(shù)曙砂。
接下來(lái)進(jìn)行源碼分析:
1. 利用 ContentProvider 的機(jī)制在應(yīng)用一開(kāi)始就給 Application 注冊(cè) ActivityLifecycleCallbacks:
最終生成的 AndroidManifest.xml 會(huì)被插入 LifecycleRuntimeTrojanProvider 的注冊(cè)代碼
在 LifecycleRuntimeTrojanProvider 的 onCreate() 里面對(duì) LifecycleDispatcher 進(jìn)行初始化
在 LifecycleDispatcher 的初始化里面給 Application 注冊(cè) ActivityLifecycleCallbacks
2. 在 ActivityLifecycleCallbacks 的 onActivityCreated() 回調(diào)中給 FragmentActivity 類型的 Activity 注冊(cè) FragmentLifecycleCallbacks 和給所有的 Activity 注入一個(gè) ReportFragment 的 Fragment:
ReportFragment 的注入代碼:
FragmentLifecycleCallbacks 的回調(diào)處理 和 DestructionReportFragment 的注入:(只分發(fā)ON_CREATE头谜、ON_START、ON_RESUME)
DestructionReportFragment 的生命周期回調(diào)處理(只分發(fā)ON_PAUSE鸠澈、ON_STOP柱告、ON_DESTROY)
調(diào)用各自的 LifecycleRegistry 的 handleLifecycleEvent() 處理生命周期事件
ReportFragment 的 生命周期回調(diào):
3. LifecycleRegistry 的 handleLifecycleEvent() 處理生命周期事件:
4. ObserverWithState 是怎么來(lái)的呢?是在 LifecycleRegistry 的 addObserver() 里面把 LifecycleObserver 轉(zhuǎn)化為一個(gè)對(duì)應(yīng)的 ObserverWithState笑陈。
轉(zhuǎn)化的代碼關(guān)鍵是 mCallback怕享,從上面可以看出 mCallback 包含了 LifecycleObserver 的信息忌怎,事件的分發(fā)也是由 mCallback 的 onStateChanged()來(lái)處理的。
注意:ObserverWithState 是 LifecycleRegistry 的內(nèi)部類,這里的 LifecycleRegistry.this.mLifecycleOwner 是創(chuàng)建 LifecycleRegistry 的實(shí)例(實(shí)現(xiàn) LifecycleRegistryOwner 的實(shí)例究履,比如TestLifeCycleActivity)策州。
5. mCallback 的生成:
Lifecycling 的 getCallback() :
a螟碎、第一個(gè)紅框內(nèi)的代碼是從緩存中取出繼承 GenericLifecycleObserver 的類的構(gòu)造函數(shù)楣嘁,然后傳入?yún)?shù) LifecycleObserver 的實(shí)例創(chuàng)建實(shí)例。該類可能是編譯時(shí)根據(jù)實(shí)現(xiàn) LifecycleObserver 的類自動(dòng)生成的 XXX_LifecycleAdapter (第二個(gè)紅色方框)(本例中 LifecycleObserverSample 對(duì)應(yīng)的是 LifecycleObserverSample_LifecycleAdapter)帆锋,或者是ReflectiveGenericLifecycleObserver (這個(gè)是在沒(méi)有找到自動(dòng)生成的 XXX_LifecycleAdapter 類的時(shí)候用的墩新,第四個(gè)紅色方框)。
b窟坐、第二個(gè)紅框內(nèi)的代碼是去查找實(shí)現(xiàn) LifecycleObserver 的類對(duì)應(yīng)的 XXX_LifecycleAdapter 類的構(gòu)造函數(shù):
本例 LifecycleObserverSample 的代碼 和 對(duì)應(yīng)的 LifecycleObserverSample_LifecycleAdapter 的代碼:
c海渊、第四個(gè)方框是沒(méi)有找到對(duì)應(yīng)的 XXX_LifecycleAdapter ,直接使用 ReflectiveGenericLifecycleObserver 類創(chuàng)建對(duì)象:
getInfo() 取出 LifecycleObserver 實(shí)例中用注解注冊(cè)的事件與相應(yīng)的處理函數(shù)哲鸳,包含該實(shí)例的父類臣疑。
6.? mCallback.onStateChanged 處理事件:
a、如果 mCallback 是實(shí)現(xiàn) LifecycleObserver 的類對(duì)應(yīng)的 XXX_LifecycleAdapter 類徙菠,那么調(diào)用的就是 XXX_LifecycleAdapter 的 onStateChanged(), 比如本例中的LifecycleObserverSample_LifecycleAdapter :
b讯沈、如果 mCallback 是 ReflectiveGenericLifecycleObserver 的實(shí)例,調(diào)用 ReflectiveGenericLifecycleObserver 的 onStateChanged()婿奔,從ReflectiveGenericLifecycleObserver.CallbackInfo mInfo 中取出事件對(duì)應(yīng)的處理函數(shù)缺狠,然后調(diào)用該函數(shù)處理事件: