Android官網最近推出了一個新的app程序框架,雖然目前正處于alpha階段,還未正式發(fā)布阐肤,但其中的實現原理和想法還是有必要先進行學習的,首先就來看看新框架對于LifeCycle的處理讲坎。
相信Android開發(fā)者最頭疼的問題之一就是android提供的組件(Activity孕惜,Fragment)包含了大量的生命周期,并且系統(tǒng)會自動對生命周期進行管理晨炕,稍不留神(應用退到后臺或者資源緊缺)就會對相應組件進行回收衫画,導致組件狀態(tài)丟失。
在新的框架中瓮栗,提供了一套對于生命周期進行管理的方法削罩,接下來看看具體的實現過程。
一费奸、實現示例
按照官網上的示例弥激,我們首先需要實現了LifecycleObserver的類:
然后在繼承于LifecycleActivity的Activity中addObserver();
就這樣愿阐,MyLocationListener就已經和MainActivity的生命周期進行了綁定微服。
二、LifecycleRegistry是什么
可以看到getLifecycle()返回的就是LifecycleRegistry缨历,LifecycleRegistry繼承于Lifecycle以蕴,Lifecycle是個抽象類,提供了注冊和刪除LifecycleObserver的方法戈二,同時提供了進行生命周期描述的Enum類舒裤。從方法的命名中可以想到喳资,有點類似于采用了觀察者模式觉吭,對于注冊的對象在特定條件進行回調。
接下來看看LifecycleRegistry是如何實現addObserver()的仆邓;
可以看到鲜滩,首先實現一個ObserverWithState的對象,然后調用該對象的sync()方法节值;
sync()方法的作用其實就是當綁定的Activity或Fragment生命周期改變時徙硅,觸發(fā)綁定的listener進行回調。
那么mCallback是如何綁定到對應的Listener的呢搞疗?
三嗓蘑、GenericLifecycleObserver
mCallback的類名是GenericLifecycleObserver,是通過Lifecycling.getCallback()方法實現的。
可以看到真正示例化的方法是getGeneratedAdapterConstructor(klass)這方法桩皿;
看到Class.forName()方法豌汇,就知道采用的是反射來找到相應的類,不過通過getAdapterName()已經修改了要反射的類名泄隔,但我們并沒有寫過結束帶"_LifecycleAdapter"字符串的類拒贱,去哪里能找到這類呢?
別忘了我們在dependencies中引入了這一句佛嬉,會不會是通過apt生成的逻澳?
annotationProcessor "android.arch.lifecycle:compiler:1.0.0-alpha3"
順藤摸瓜,果然在build目錄對應文件夾下會生成MyLocationListener_LifecycleAdapter類暖呕。
再看看它的實現斜做,原來我們先前聲明的@OnLifecycleEvent都會生成對應的代碼。
到目前我們已經理順了事件處理的流程湾揽。但另外一個問題來了陨享,這些事件是從哪里發(fā)出來的呢?
四钝腺、Event觸發(fā)源
我們知道Event處理是通過調用LifecycleRegistry的handleLifecycleEvent()來實現的抛姑,順藤摸瓜,哪里會調用handleLifecycleEvent()方法呢艳狐?
在android.arch.lifecycle.ReportFragment中定硝,我們找到了調用handleLifecycleEvent()方法的地方。ReportFragment繼承Fragment毫目,通過Fragment的生命周期來達到對綁定Listener生命周期的管理蔬啡。這好像有點似曾相識,不錯镀虐,在Glide里邊箱蟆,Activity或Fragment也是通過這樣的方法,通過示例化一個沒有ui的fragment刮便,對相應事件的生命周期進行管理空猜。
那么ReportFragment是插入到相應的Activity或Fragment當中的呢?
找到LifecycleDispatcher這個類恨旱,原來是通過監(jiān)聽ActivityLifecycleCallbacks來實現對應的綁定的辈毯,在onActivityCreated()的回調中插入ReportFragment。
到這里大概流程都已經全部走通了搜贤,Event的觸發(fā)源就是通過綁定的ReportFragment在對應生命周期的回調中觸發(fā)的谆沃。
那么最后一個問題,LifecycleDispatcher的init()方法何時執(zhí)行的呢仪芒?
五唁影、LifecycleDispatcher何時啟動
啟動的地方是一個叫LifecycleRuntimeTrojanProvider的類耕陷,該類繼承于ContentProvider,并且該類除了在onCreate()方法里有實現据沈,其他的都沒意義啃炸。
為什么要繼承ContentProvider呢,因為ContentProvider會在程序啟動的時候默認先執(zhí)行卓舵,這樣在程序啟動的最開始南用,對于生命周期的管理就已經開始了。
我們在最終生成的manifest.xml里邊也找到了該類掏湾。
至此裹虫,整個框架對于生命周期的管理流程已經全部分析結束。