JetPack之生命周期組件Lifecycle

Lifecycle 的作用

Lifecycle是具有生命周期感知能力的組件,也就是說,我們能在 Activity 或者 Fragment 的生命周期發(fā)生變化的時(shí)候得到通知首量,我們往往會(huì)在Activity 的各種生命中周期方法里執(zhí)行特定的方法叹话,比如,進(jìn)行廣播的注冊(cè)和解綁粱年、Eventbus 的注冊(cè)和解綁等:

如果我們把很多這種需要跟生命周期相關(guān)的邏輯代碼都直接放在Activity 的生命周期方法中,Activity 將會(huì)變得難以維護(hù)罚拟。通過 Lifecycle台诗,我們就能避免這種問題。因?yàn)楸举|(zhì)上我們需要的只是Activity 或者 Fragment 的生命周期發(fā)生改變的時(shí)候能通知到我們赐俗,以便我們?cè)趯?duì)應(yīng)生命周期中執(zhí)行對(duì)應(yīng)的方法拉队。

Lifecycle 的基本使用

導(dǎo)入Lifecycle 依賴

Lifecycle被包含在 support library 26.1.0 及之后的依賴包中,如果我們的項(xiàng)目依賴的支持庫(kù)版本在 26.1.0及以上阻逮,那么不需要額外導(dǎo)入Lifecycle 庫(kù)

? implementation 'com.android.support:appcompat-v7:28.0.0'

如果支持庫(kù)版本小于26.1.0 粱快,就需要單獨(dú)導(dǎo)入 Lifecycle 庫(kù) :

? implementation "android.arch.lifecycle:runtime:1.1.1"

如果項(xiàng)目已經(jīng)遷移到了AndroidX,可以使用下面的方式引入 :

? implementation "androidx.lifecycle:lifecycle-runtime:2.0.0"

??? 建議大家嘗試盡快把項(xiàng)目遷移為AndroidX叔扼,因?yàn)楹芏喔率驴蓿瑫?huì)最先在AndroidX 中發(fā)布,逐漸擺脫傳統(tǒng)的support包瓜富。比如這里要講的 Lifecycle 在 AndroidX 中已經(jīng)升級(jí)到了 2.x版本鳍咱,而支持庫(kù)中還是 1.x 版本。

以 support library 版本在 26.1.0 及以上為前提与柑,這里我們分兩種情況來講谤辜。一種是我們創(chuàng)建的Activity 繼承自AppCompatActivity(以Activity 為例,F(xiàn)ragment類似)价捧,另一種是創(chuàng)建的Activity 繼承自普通的 Activity丑念,而非 AppCompatActivity。

Lifecycle的實(shí)現(xiàn)機(jī)制是觀察者模式结蟋,使用過程如下:

1. 構(gòu)建一個(gè)Lifecycle 對(duì)象(通過一個(gè)實(shí)現(xiàn)了 LifecycleOwner 接口的對(duì)象的 getLifecycle()方法返回)脯倚,這個(gè)對(duì)象就是一個(gè)被觀察者,具有生命周期感知能力

2. 構(gòu)建一個(gè)LifecycleObserver 對(duì)象嵌屎,它對(duì)指定的 Lifecycle 對(duì)象進(jìn)行監(jiān)聽

3. 通過將Lifecycle 對(duì)象的 addObserver(…) 方法挠将,將 Lifecycle 對(duì)象和 LifecycleObserver 對(duì)象進(jìn)行綁定胳岂。

1、 繼承自 AppCompatActivity

首先舔稀,我們創(chuàng)建一個(gè)MyObserver.java 類乳丰,讓它實(shí)現(xiàn) LifecycleObserver 接口( LifecycleObserver接口是一個(gè)空接口,主要是給注解處理器使用)内贮,如下

public class MyObserver implementsLifecycleObserver {

????? private static final String TAG = "MyObserver";

??? // 使用注解? @OnLifecycleEvent? 來表明該方法需要監(jiān)聽指定的生命周期事件

??? @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)

??? public void connectListener() {

??????? //??????? ...

??????? Log.d(TAG,? "connectListener:? --------?? onResume" );

??? }

? @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)

? public void disconnectListener() {

??????? //??????? ...

??????? Log.d(TAG, "disconnectListener:? -------?? onPause");

??? }

}

可以看到产园,我們通過在方法上使用@OnLifecycleEvent注解使得該方法具有了生命周期感知能力。Lifecycle主要就是通過 Event 和 State 這兩個(gè)枚舉類來跟蹤所關(guān)聯(lián)組件的生命周期狀態(tài)

接下來夜郁,讓我們的Activity 繼承自 AppCompatActivity什燕,然后在 onCreate(…)方法中通過getLifecycle().addObserver(new MyObserver())完成 Lifecycle和LifecycleObserver 的綁定

public class LifeCycleActivity extends AppCompatActivity {

??? @Override

? protected void onCreate(Bundle savedInstanceState) {

??????? super.onCreate(savedInstanceState);

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

??????? // 就只需要這一行代碼,簡(jiǎn)潔吧

??????? getLifecycle().addObserver(new? MyObserver());

??? }

}

然后我們就可以運(yùn)行下程序竞端,切換到Home 也或者按返回鍵屎即,就能看到隨著生命周期的變化,MyObserver() 中定義的方法在控制臺(tái)中也被正確地打印了出來事富。

AppCompatActivity 的祖先類 SupportActivity已經(jīng)默認(rèn)實(shí)現(xiàn)了 LifecycleOwner 接口技俐,通過其 getLifecycle() 方法可以直接返回一個(gè)Lifecycle 對(duì)象

2、 繼承自普通的 Activity

我們需要自己實(shí)現(xiàn)LifecycleOwner接口统台,并在具體的生命周期下通過LifecycleRegistry 的 markState(...)方法來主動(dòng)進(jìn)行事件的分發(fā)

public class LifeCycleCommonActivity extends Activity implements LifecycleOwner {

???? private LifecycleRegistry mLifecycleRegistry;

???? @Override

???? protected void onCreate(Bundle savedInstanceState) {

????????? super.onCreate(savedInstanceState);

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

??????? mLifecycleRegistry = new? LifecycleRegistry(this);

??????? getLifecycle().addObserver(new? MyObserver());

??????? mLifecycleRegistry.markState(Lifecycle.State.CREATED);

??? }

??? @Override

? protected void onResume() {

??????? super.onResume();

??????? mLifecycleRegistry.markState(Lifecycle.State.RESUMED);

??? }

??? @Override

? protected void onPause() {

??????? super.onPause();

??????? mLifecycleRegistry.markState(Lifecycle.State.STARTED);

??? }

??? @NonNull

??? @Override

? public Lifecycle getLifecycle() {

??????? return mLifecycleRegistry;

??? }

}

LifeCycleCommonActivity實(shí)現(xiàn)了LifecycleOwner接口(實(shí)現(xiàn)該接口的對(duì)象雕擂,即是Lifecycle 的持有者),并在其 getLifecycle( ) 方法中返回了一個(gè) LifecycleRegistry對(duì)象贱勃,而 LifecycleRegistry 是 Lifecycle 的子類井赌。其他使用方式,則完全相同贵扰。

為了讓使用更加方便靈活仇穗,Lifecycle還提供了查詢當(dāng)前組件所處的生命周期狀態(tài)的方法:

lifecycle.getCurrentState().isAtLeast(STARTED)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市戚绕,隨后出現(xiàn)的幾起案子仪缸,更是在濱河造成了極大的恐慌,老刑警劉巖列肢,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宾茂,居然都是意外死亡瓷马,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門跨晴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欧聘,“玉大人,你說我怎么就攤上這事端盆』持瑁” “怎么了费封?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蒋伦。 經(jīng)常有香客問我弓摘,道長(zhǎng),這世上最難降的妖魔是什么痕届? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任韧献,我火速辦了婚禮,結(jié)果婚禮上研叫,老公的妹妹穿的比我還像新娘锤窑。我一直安慰自己,他們只是感情好嚷炉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布渊啰。 她就那樣靜靜地躺著,像睡著了一般申屹。 火紅的嫁衣襯著肌膚如雪绘证。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天独柑,我揣著相機(jī)與錄音迈窟,去河邊找鬼。 笑死忌栅,一個(gè)胖子當(dāng)著我的面吹牛车酣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播索绪,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼湖员,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了瑞驱?” 一聲冷哼從身側(cè)響起娘摔,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唤反,沒想到半個(gè)月后凳寺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彤侍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年肠缨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盏阶。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晒奕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脑慧,我是刑警寧澤魄眉,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站闷袒,受9級(jí)特大地震影響坑律,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霜运,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一脾歇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淘捡,春花似錦藕各、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至膘魄,卻和暖如春乌逐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背创葡。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工浙踢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灿渴。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓洛波,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親骚露。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹬挤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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