Android Architecture LifeCycle

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里邊也找到了該類掏湾。

至此裹虫,整個框架對于生命周期的管理流程已經全部分析結束。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末融击,一起剝皮案震驚了整個濱河市筑公,隨后出現的幾起案子,更是在濱河造成了極大的恐慌尊浪,老刑警劉巖匣屡,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異拇涤,居然都是意外死亡捣作,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門鹅士,熙熙樓的掌柜王于貴愁眉苦臉地迎上來券躁,“玉大人,你說我怎么就攤上這事掉盅∫舶荩” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵趾痘,是天一觀的道長慢哈。 經常有香客問我,道長永票,這世上最難降的妖魔是什么卵贱? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮瓦侮,結果婚禮上艰赞,老公的妹妹穿的比我還像新娘佣谐。我一直安慰自己肚吏,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布狭魂。 她就那樣靜靜地躺著罚攀,像睡著了一般党觅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斋泄,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天杯瞻,我揣著相機與錄音,去河邊找鬼炫掐。 笑死魁莉,一個胖子當著我的面吹牛,可吹牛的內容都是我干的募胃。 我是一名探鬼主播旗唁,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痹束!你這毒婦竟也來了检疫?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤祷嘶,失蹤者是張志新(化名)和其女友劉穎屎媳,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體论巍,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡烛谊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了嘉汰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晒来。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖郑现,靈堂內的尸體忽然破棺而出湃崩,到底是詐尸還是另有隱情,我是刑警寧澤接箫,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布攒读,位于F島的核電站,受9級特大地震影響辛友,放射性物質發(fā)生泄漏薄扁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一废累、第九天 我趴在偏房一處隱蔽的房頂上張望邓梅。 院中可真熱鬧,春花似錦邑滨、人聲如沸日缨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匣距。三九已至面哥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毅待,已是汗流浹背尚卫。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尸红,地道東北人吱涉。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像外里,于是被迫代替她去往敵國和親邑飒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • afinalAfinal是一個android的ioc级乐,orm框架 https://github.com/yangf...
    passiontim閱讀 15,401評論 2 45
  • 偶感涼意 枯葉為你披上 深淺深的黃披肩 那就是一幅愛著你的畫面 充滿笑聲的秋 秋風時不時來給你一個吻 枯葉上 我看...
    琴檸閱讀 152評論 0 0
  • 論文:https://arxiv.org/pdf/1506.01497v3.pdf代碼:https://githu...
    薛子育閱讀 906評論 0 0
  • 剛剛過去的中秋節(jié)又刺激了我一把疙咸。 說說我身邊的人吧。 我老公的弟弟和弟媳回家過節(jié)风科。弟弟是國防生撒轮,畢業(yè)很幸運地分到了...
    紀小暢閱讀 356評論 1 0