Android官方架構(gòu)組件LifeCycle詳解

前言

LifeCycle是Android官方提供的組件冕屯,可見地址:https://developer.android.com/topic/libraries/architecture/lifecycle

Lifecycle?是一個(gè)類窖壕,它持有關(guān)于組件(如 Activity 或 Fragment)生命周期狀態(tài)的信息寄悯,并且允許其他對(duì)象觀察此狀態(tài)冠胯。

以下是閱讀官網(wǎng)的說明:

LifeCycle指的是使用生命周期通知組件去處理生命周期哩陕。

支持生命周期的組件執(zhí)行操作以響應(yīng)另一個(gè)組件(例如活動(dòng)和片段)的生命周期狀態(tài)更改驮捍。這些組件可幫助您生成組織性更好罩润,并且通常重量更輕的代碼玖翅,這些代碼更易于維護(hù)。

常見的模式是在activity和fragment的生命周期方法中實(shí)現(xiàn)依賴組件的操作割以。但是金度,這種模式導(dǎo)致代碼的組織不良以及錯(cuò)誤泛濫。通過使用生命周期感知組件严沥,您可以將相關(guān)組件的代碼從生命周期方法中移出并移入組件本身猜极。

android.arch.lifecycle?軟件包提供了類和接口,使您可以構(gòu)建支持生命周期的?組件消玄,這些組件可以根據(jù)activity或fragment的當(dāng)前生命周期狀態(tài)自動(dòng)調(diào)整其行為跟伏。

注意:要導(dǎo)入?android.arch.lifecycle?到您的Android項(xiàng)目中

為什么要用LifeCycle

我們在處理activity或者fragment的生命周期時(shí),不可避免會(huì)遇到這樣的情況:在activity的oncreate中初始化某些成員變量翩瓜,在onstop中釋放或者銷毀受扳。實(shí)際開發(fā)中會(huì)導(dǎo)致oncreate onstop中的代碼非常臃腫。

LifeCycle使用說明

舉例使用mvp模式說明:

1兔跌、新建工程

在project的build.gradle中添加

maven {

? ? ? ? ? ? url 'https://maven.google.com'

? ? ? ? }

官網(wǎng)上寫的是google()勘高,但是google()需要gradle 4.0才支持

2、要觀察到Presenter的生命周期事件都列了出來浮定,封裝到BasePresenter 中相满,只要繼承了BasePresenter 的子類都能感知到Activity容器對(duì)應(yīng)的生命周期事件层亿,并在子類重寫對(duì)應(yīng)的行為代碼

public interface IPresenter extends LifecycleObserver {

? ? @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)

? ? void onCreate(@NotNull LifecycleOwner owner);

? ? @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)

? ? void onDestory(@NotNull LifecycleOwner owner);

? ? @OnLifecycleEvent(Lifecycle.Event.ON_ANY)

? ? void onLifeCycleChanged(@NotNull LifecycleOwner owner, @NotNull Lifecycle.Event event);

}



public class BasePresenter implements IPresenter {


? ? @Override

? ? public void onCreate(@NotNull LifecycleOwner owner) {

? ? }

? ? @Override

? ? public void onDestory(@NotNull LifecycleOwner owner) {

? ? }

? ? @Override

? ? public void onLifeCycleChanged(@NotNull LifecycleOwner owner, @NotNull Lifecycle.Event event) {

? ? }

}


public class MainPresenter extends BasePresenter {

? ? private final String TAG = MainPresenter.class.getName();

? ? private Context context;

? ? public MainPresenter(Context context) {

? ? ? ? this.context = context;

? ? }

? ? @Override

? ? public void onCreate(@NotNull LifecycleOwner owner) {

? ? ? ? super.onCreate(owner);

? ? ? ? Log.d(TAG, "LifeCycle------onCreate------");

? ? }

? ? @Override

? ? public void onDestory(@NotNull LifecycleOwner owner) {

? ? ? ? super.onDestory(owner);

? ? ? ? Log.d(TAG, "LifeCycle------onDestory------");

? ? }

}

3桦卒、在Activity/Fragment容器中添加Observer:


public class MainActivity extends AppCompatActivity {

? ? private IPresenter mPresenter;

? ? private final String TAG = MainActivity.class.getName();

? ? @Override

? ? protected void onCreate(Bundle savedInstanceState) {

? ? ? ? super.onCreate(savedInstanceState);

? ? ? ? setContentView(R.layout.activity_main);

? ? ? ? Log.d(TAG, "MainActivity------onCreate------");

? ? ? ? mPresenter = new MainPresenter(this);

? ? ? ? getLifecycle().addObserver(mPresenter);//添加LifecycleObserver

? ? }

? ? @Override

? ? protected void onDestroy() {

? ? ? ? super.onDestroy();

? ? ? ? Log.d(TAG, "MainActivity------onDestroy------");

? ? }

}

這樣的話,每當(dāng)Activity發(fā)生了對(duì)應(yīng)的生命周期改變匿又,Presenter就會(huì)執(zhí)行對(duì)應(yīng)事件注解的方法

除onCreate和onDestroy事件之外方灾,Lifecycle一共提供了所有的生命周期事件,只要?

通過注解進(jìn)行聲明碌更,就能夠使LifecycleObserver觀察到對(duì)應(yīng)的生命周期事件:




原理說明

網(wǎng)上的圖


LifecycleObserver接口( Lifecycle觀察者):實(shí)現(xiàn)該接口的類裕偿,通過注解的方式,可以通過被LifecycleOwner類的addObserver(LifecycleObserver o)方法注冊,被注冊后痛单,LifecycleObserver便可以觀察到LifecycleOwner的生命周期事件嘿棘。

LifecycleOwner接口(Lifecycle持有者):實(shí)現(xiàn)該接口的類持有生命周期(Lifecycle對(duì)象),該接口的生命周期(Lifecycle對(duì)象)的改變會(huì)被其注冊的觀察者LifecycleObserver觀察到并觸發(fā)其對(duì)應(yīng)的事件旭绒。

Lifecycle(生命周期):和LifecycleOwner不同的是鸟妙,LifecycleOwner本身持有Lifecycle對(duì)象焦人,LifecycleOwner通過其Lifecycle getLifecycle()的接口獲取內(nèi)部Lifecycle對(duì)象。

State(當(dāng)前生命周期所處狀態(tài)):如圖所示重父。

Event(當(dāng)前生命周期改變對(duì)應(yīng)的事件):如圖所示花椭,當(dāng)Lifecycle發(fā)生改變,如進(jìn)入onCreate,會(huì)自動(dòng)發(fā)出ON_CREATE事件房午。


以SupportActivity(AppCompatActivity extends SupportActivity)為例矿辽,SupportActivity實(shí)現(xiàn)了LifecycleOwner接口,這意味著SupportActivity對(duì)象持有生命周期對(duì)象(Lifecycle)郭厌,并可以通過Lifecycle getLifecycle()方法獲取內(nèi)部的Lifecycle對(duì)象


可以看到袋倔,實(shí)現(xiàn)的getLifecycle()方法,實(shí)際上返回的是?LifecycleRegistry?對(duì)象折柠,LifecycleRegistry對(duì)象實(shí)際上繼承了?Lifecycle奕污,這個(gè)下文再講。

持有Lifecycle有什么作用呢液走?實(shí)際上在SupportActivity( ReportFragment.injectIfNeededIn())對(duì)應(yīng)的生命周期內(nèi)碳默,都會(huì)發(fā)送對(duì)應(yīng)的生命周期事件給內(nèi)部的?LifecycleRegistry對(duì)象處理,內(nèi)部的Lifecycle對(duì)象(就是mLifecycleRegistry)將生命周期對(duì)應(yīng)的事件作為參數(shù)傳給了?handleLifecycleEvent()?方法

handleLifecycleEvent方法會(huì)通過 getStateAfter 獲取當(dāng)前應(yīng)處的狀態(tài)并修改 Lifecycle本身的State 值缘眶,緊接著遍歷所 LifecycleObserver 并同步且通知其狀態(tài)發(fā)生變化嘱根,因此就能觸發(fā)LifecycleObserver 對(duì)應(yīng)的生命周期事件。


總結(jié)

Lifecycle簡單且獨(dú)立(實(shí)際上配合其他組件味道更佳)巷懈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末该抒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子顶燕,更是在濱河造成了極大的恐慌凑保,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涌攻,死亡現(xiàn)場離奇詭異欧引,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)恳谎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門芝此,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人因痛,你說我怎么就攤上這事婚苹。” “怎么了鸵膏?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵膊升,是天一觀的道長。 經(jīng)常有香客問我谭企,道長廓译,這世上最難降的妖魔是什么结胀? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮责循,結(jié)果婚禮上糟港,老公的妹妹穿的比我還像新娘。我一直安慰自己院仿,他們只是感情好秸抚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歹垫,像睡著了一般剥汤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上排惨,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天吭敢,我揣著相機(jī)與錄音,去河邊找鬼暮芭。 笑死鹿驼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辕宏。 我是一名探鬼主播畜晰,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瑞筐!你這毒婦竟也來了凄鼻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤聚假,失蹤者是張志新(化名)和其女友劉穎块蚌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膘格,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峭范,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闯袒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虎敦。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡游岳,死狀恐怖政敢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胚迫,我是刑警寧澤喷户,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站访锻,受9級(jí)特大地震影響褪尝,放射性物質(zhì)發(fā)生泄漏闹获。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一河哑、第九天 我趴在偏房一處隱蔽的房頂上張望避诽。 院中可真熱鬧,春花似錦璃谨、人聲如沸沙庐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拱雏。三九已至,卻和暖如春底扳,著一層夾襖步出監(jiān)牢的瞬間铸抑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工衷模, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹊汛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓阱冶,卻偏偏與公主長得像柒昏,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子熙揍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容