Android Jetpack——Lifecycle

一、前言

Android Architecture Components是谷歌在Google I/O 2017大會(huì)上發(fā)布一套幫助開(kāi)發(fā)者解決Android架構(gòu)設(shè)計(jì)的方案衡蚂。主要包括兩大塊內(nèi)容:
(1)生命周期相關(guān)的:Lifecycle-aware Components
(2)數(shù)據(jù)庫(kù)解決方案:Room
主要架構(gòu)如下圖:


image.png

其中有主要包含了以下幾大組件:
Lifecycle毛甲、LiveData具被、ViewModel、Room一姿。
下面逐一介紹每個(gè)組件:

二叮叹、Lifecycle 管理組件的生命周期

1.Lifecycle介紹

Lifecycle 是android.arch.lifecycle 包下各種類和相關(guān)接口,通過(guò)該Lifecycle 組件可以讓開(kāi)發(fā)者構(gòu)建能夠感知其他組件(主要是Activity,Fragment)的生命周期的變化衬横。也就是說(shuō)通過(guò)注冊(cè)Lifecycle的類,可以監(jiān)聽(tīng)Activity或者Fragment的生命周期的變化遥诉。

2.常規(guī)MVP的實(shí)現(xiàn)

在常規(guī)的MVP模式中我們監(jiān)聽(tīng)Activity的生命周期一般是這樣做的:
首先創(chuàng)建一個(gè)BaseActivityPresenter接口,定義相關(guān)生命周期需要回調(diào)的方法霉翔。

package com.jilian.androidarchitecture;

public interface BaseActivityPresenter {

    void onCreate();

    void onStart();

    void onResume();

    void onPause();

    void onStop();

    void onDestroy();
}

創(chuàng)建ActivityPresenter類實(shí)現(xiàn)BaseActivityPresenter 接口苞笨,在對(duì)應(yīng)的方法中打印。

package com.jilian.androidarchitecture;

import android.util.Log;

public class ActivityPresenter implements BaseActivityPresenter {
    private static final String TAG = "ActivityPresenter";

    @Override
    public void onCreate() {
        Log.e(TAG, "onCreate: " );
    }

    @Override
    public void onStart() {
        Log.e(TAG, "onStart: " );
    }

    @Override
    public void onResume() {
        Log.e(TAG, "onResume: " );
    }

    @Override
    public void onPause() {
        Log.e(TAG, "onPause: " );
    }

    @Override
    public void onStop() {
        Log.e(TAG, "onStop: " );
    }

    @Override
    public void onDestroy() {
        Log.e(TAG, "onDestroy: " );
    }
}

創(chuàng)建需要監(jiān)聽(tīng)的生命周期的Activity——MyActivity

package com.jilian.androidarchitecture;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

public class MyActivity extends AppCompatActivity {
    private BaseActivityPresenter presenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        presenter = new ActivityPresenter();
        presenter.onCreate();
    }

    @Override
    protected void onResume() {
        super.onResume();
        presenter.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        presenter.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
        presenter.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.onDestroy();
    }
}

然后在MyActivity的各個(gè)生命周期方法中 調(diào)用presenter中的對(duì)應(yīng)的方法,將數(shù)據(jù)進(jìn)行打印

02-21 14:12:47.739 4328-4328/com.jilian.androidarchitecture E/ActivityPresenter: onCreate: 
02-21 14:12:47.744 4328-4328/com.jilian.androidarchitecture E/ActivityPresenter: onResume: 
02-21 14:12:49.488 4328-4328/com.jilian.androidarchitecture E/ActivityPresenter: onPause: 
02-21 14:12:49.903 4328-4328/com.jilian.androidarchitecture E/ActivityPresenter: onStop: 
02-21 14:12:49.904 4328-4328/com.jilian.androidarchitecture E/ActivityPresenter: onDestroy: 

以上的做法確實(shí)可以實(shí)現(xiàn)對(duì)Activity的生命周期進(jìn)行監(jiān)聽(tīng)谚中,但是當(dāng)我們需要監(jiān)聽(tīng)其他的Activity的時(shí)候寥枝,我們又需要在另外的一個(gè)Activity中的每一個(gè)生命周期方法調(diào)用presenter中的對(duì)應(yīng)的方法。這樣做會(huì)使得代碼比較冗余某筐。Lifecycle正是解決了該問(wèn)題冠跷。

3. 使用 Lifecycle

我們創(chuàng)建一個(gè)ActivityLifeObserver,實(shí)現(xiàn)BaseActivityPresenter和LifecycleObserver接口弟疆。在對(duì)應(yīng)方法中加上相應(yīng)的 @OnLifecycleEvent注解盗冷,如@OnLifecycleEvent(Lifecycle.Event.ON_CREATE),就是監(jiān)聽(tīng)Activity的onCreat方法仪糖。

package com.jilian.androidarchitecture;

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.OnLifecycleEvent;
import android.util.Log;

public class ActivityLifeObserver implements BaseActivityPresenter, LifecycleObserver {
    private static final String TAG ="ActivityLifeObserver" ;

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    @Override
    public void onCreate() {
        Log.e(TAG, "onCreate: " );
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    @Override
    public void onStart() {
        Log.e(TAG, "onStart: " );
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    @Override
    public void onResume() {
        Log.e(TAG, "onResume: " );
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    @Override
    public void onPause() {
        Log.e(TAG, "onPause: " );
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    @Override
    public void onStop() {
        Log.e(TAG, "onStop: " );
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    @Override
    public void onDestroy() {
        Log.e(TAG, "onDestroy: " );
    }
}

創(chuàng)建需要監(jiān)聽(tīng)的Activity——LifecycleActivity锅劝,實(shí)現(xiàn)LifecycleOwner接口。然后注冊(cè)我們創(chuàng)建的ActivityLifeObserver玻粪。

package com.jilian.androidarchitecture;

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.LifecycleRegistry;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

public class LifecycleActivity extends AppCompatActivity implements LifecycleOwner {
    private LifecycleRegistry registry;



    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lifecycle);
        registry = new LifecycleRegistry(this);
        //注冊(cè)需要監(jiān)聽(tīng)的 Observer
        registry.addObserver(new ActivityLifeObserver());
    }
    @Override
    public Lifecycle getLifecycle() {
        return registry;
    }
}

注冊(cè)完之后就可以完美的監(jiān)聽(tīng)LifecycleActivity 的生命周期的變化劲室。

02-21 14:44:33.965 4328-4328/com.jilian.androidarchitecture E/ActivityLifeObserver: onCreate: 
02-21 14:44:33.966 4328-4328/com.jilian.androidarchitecture E/ActivityLifeObserver: onStart: 
02-21 14:44:33.969 4328-4328/com.jilian.androidarchitecture E/ActivityLifeObserver: onResume: 
02-21 14:44:38.895 4328-4328/com.jilian.androidarchitecture E/ActivityLifeObserver: onPause: 
02-21 14:44:39.340 4328-4328/com.jilian.androidarchitecture E/ActivityLifeObserver: onStop: 
02-21 14:44:39.341 4328-4328/com.jilian.androidarchitecture E/ActivityLifeObserver: onDestroy: 

從上面我們可以看到Lifecycle主要使用步驟:
1.創(chuàng)建ActivityLifeObserver,并在相應(yīng)的方法中添加相應(yīng)的注解充蓝,表明需要監(jiān)聽(tīng)Activity生命周期的哪一個(gè)環(huán)節(jié)喉磁。
2.在Activity中注冊(cè)ActivityLifeObserver,這樣Activity生命周期的變化就能被ActivityLifeObserver感知协怒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末孕暇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子芭商,更是在濱河造成了極大的恐慌搀缠,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件簸州,死亡現(xiàn)場(chǎng)離奇詭異岸浑,居然都是意外死亡瑰步,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門读虏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袁滥,“玉大人,你說(shuō)我怎么就攤上這事题翻。” “怎么了塑荒?”我有些...
    開(kāi)封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)本谜。 經(jīng)常有香客問(wèn)我偎窘,道長(zhǎng),這世上最難降的妖魔是什么他托? 我笑而不...
    開(kāi)封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任仆葡,我火速辦了婚禮,結(jié)果婚禮上沿盅,老公的妹妹穿的比我還像新娘腰涧。我一直安慰自己,他們只是感情好窖铡,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布费彼。 她就那樣靜靜地躺著,像睡著了一般箍铲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聋庵,一...
    開(kāi)封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天芙粱,我揣著相機(jī)與錄音,去河邊找鬼脱货。 笑死,一個(gè)胖子當(dāng)著我的面吹牛振峻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烫堤,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凤价,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了富蓄?” 一聲冷哼從身側(cè)響起慢逾,我...
    開(kāi)封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎口注,沒(méi)想到半個(gè)月后君珠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年舰攒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悔醋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猾愿,死狀恐怖账阻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姻僧,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布赌莺,位于F島的核電站松嘶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏翠订。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一港谊、第九天 我趴在偏房一處隱蔽的房頂上張望橙弱。 院中可真熱鬧,春花似錦棘脐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至煞抬,卻和暖如春构哺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曙强。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工碟嘴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娜扇。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓边败,卻偏偏與公主長(zhǎng)得像捎废,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子排截,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

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