【Jetpack日記(2)】Lifecycle的基本使用

Lifecycle介紹

Lifecycle組件屬于Jetpack的架構(gòu)組件中晃听,它是一個(gè)生命周期感知組件安裝官方文檔的說(shuō)明,它可以感知Activity和Fragment生命周期的變化卷拘,這樣子可以讓Activity和Fragment的代碼更為的精簡(jiǎn),而且一些生命周期的處理就可以單獨(dú)的放在一個(gè)類里去處理了。

Lifecycle官方文檔介紹


Lifecycle的基本使用

使用Lifecycle需要在app的build.gradle文件下進(jìn)行導(dǎo)入承匣,詳細(xì)請(qǐng)看Lifecycle導(dǎo)入說(shuō)明充尉。

//版本號(hào)請(qǐng)查看官方說(shuō)明
implementation "android.arch.lifecycle:extensions:2.1.0"

然后我們創(chuàng)建一個(gè)類繼承LifecycleObserver接口,這就是一個(gè)觀察生命周期的接口只盹,代碼如下所示:

public class MyObserver implements LifecycleObserver {

    private static final String TAG = "MainActivity";

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart() {
        Log.i(TAG, "Lifecycle onStart生命周期");
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate() {
        Log.i(TAG, "Lifecycle onCreate生命周期");
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
        Log.i(TAG, "Lifecycle onResume生命周期");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
        Log.i(TAG, "Lifecycle onPause生命周期");
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    protected void onStop() {
        Log.i("MainActivity","Lifecycle onStop生命周期");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestory() {
        Log.i(TAG, "Lifecycle onDestory生命周期");
    }

}

我們可以使用注解在每個(gè)方法上標(biāo)記相應(yīng)的生命周期辣往,這樣就可以去調(diào)用了,接著我們要在需要監(jiān)聽的Activity和Fragment下去進(jìn)行添加監(jiān)聽(被觀察者):

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //添加監(jiān)聽
        getLifecycle().addObserver(new MyObserver());
        Log.i("MainActivity","Activity onCreate");
    }


    @Override
    protected void onStart() {
        super.onStart();
        Log.i("MainActivity","Activity onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("MainActivity","Activity onResume");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("MainActivity","Activity onDestroy");
    }


    @Override
    protected void onPause() {
        super.onPause();
        Log.i("MainActivity","Activity onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("MainActivity","Activity onStop");
    }
}

在Android Support Library 26.1.0及其之后的版本殖卑,Activity和Fragment已經(jīng)默認(rèn)實(shí)現(xiàn)了LifecycleOwner接口站削,也就是被觀察者,所以我們可以直接調(diào)用getLifecycle()來(lái)進(jìn)行添加觀察者孵稽。運(yùn)行結(jié)果如下:

生命周期監(jiān)聽結(jié)果

我們會(huì)發(fā)現(xiàn)添加觀察者后當(dāng)Activity的生命周期被調(diào)用的時(shí)候MyObserver相關(guān)的方法也會(huì)被調(diào)用许起,這樣我們就可以在MyObserver類中做需要的業(yè)務(wù)邏輯了十偶,這里要注意一下,當(dāng)進(jìn)入onPause()及之后的生命周期回調(diào)的時(shí)候园细,是先調(diào)用監(jiān)聽者相關(guān)的方法的然后才去調(diào)用Activity相關(guān)的方法惦积。這里需要注意一下。

關(guān)于自定義LifecycleOwner

剛剛也說(shuō)過(guò)了Activity和Fragment已經(jīng)默認(rèn)實(shí)現(xiàn)了LifecycleOwner接口猛频,但是我們也可以自定義一個(gè)LifecycleOwner狮崩,我們要通過(guò)LifecycleRegistry去進(jìn)行注冊(cè),LifecycleRegistry是Lifecycle的子類鹿寻。LifecycleRegistry主要是控制LifecycleOwner的狀態(tài)以及狀態(tài)切換睦柴,按照官方文檔的代碼如下:

public class TwoActivity extends AppCompatActivity {


    private LifecycleRegistry lifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);

        //注冊(cè)
        lifecycleRegistry = new LifecycleRegistry(this);
        lifecycleRegistry.markState(Lifecycle.State.CREATED);
    }


    @Override
    protected void onStart() {
        super.onStart();
        lifecycleRegistry.markState(Lifecycle.State.STARTED);
        Log.i("TwoActivity","Activity onStart");
    }


    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return lifecycleRegistry;
    }
}

但是你會(huì)發(fā)現(xiàn)一個(gè)問題lifecycleRegistry.markState()竟然是一個(gè)廢棄方法,而且跑起來(lái)是會(huì)報(bào)錯(cuò)的毡熏。

廢棄方法

報(bào)錯(cuò)如圖

報(bào)錯(cuò)提示說(shuō)第一次調(diào)用getLifecycle()坦敌,也就是自定義lifecycleRegistry的時(shí)候需要構(gòu)建它的生命周期,是的痢法,lifecycleRegistry也有自己的運(yùn)行狀態(tài)狱窘,我們可以通過(guò)getLifecycle().getCurrentState()來(lái)進(jìn)行獲取,報(bào)錯(cuò)的原因是這個(gè)AppCompatActivity其實(shí)已經(jīng)有一個(gè)lifecycleRegistry了财搁,而且已經(jīng)構(gòu)建它的生命周期了训柴,而其他的一些自義定的類需成為L(zhǎng)ifecycleOwner,就需要繼承LifecycleOwner然后才能進(jìn)行自定義(比如Activity)妇拯。至于廢棄問題幻馁,官方文檔也沒說(shuō)明,Google一下是說(shuō)推薦使用setCurrentState()方法來(lái)設(shè)置狀態(tài)越锈。

lifecycleRegistry.setCurrentState(Lifecycle.State.CREATED);


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仗嗦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子甘凭,更是在濱河造成了極大的恐慌稀拐,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丹弱,死亡現(xiàn)場(chǎng)離奇詭異德撬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)躲胳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蜓洪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人坯苹,你說(shuō)我怎么就攤上這事隆檀。” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵恐仑,是天一觀的道長(zhǎng)泉坐。 經(jīng)常有香客問我,道長(zhǎng)裳仆,這世上最難降的妖魔是什么腕让? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮歧斟,結(jié)果婚禮上纯丸,老公的妹妹穿的比我還像新娘。我一直安慰自己构捡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布壳猜。 她就那樣靜靜地躺著勾徽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪统扳。 梳的紋絲不亂的頭發(fā)上喘帚,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音咒钟,去河邊找鬼吹由。 笑死,一個(gè)胖子當(dāng)著我的面吹牛朱嘴,可吹牛的內(nèi)容都是我干的倾鲫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼萍嬉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼乌昔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起壤追,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤磕道,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后行冰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溺蕉,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年悼做,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疯特。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肛走,死狀恐怖辙芍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤故硅,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布庶灿,位于F島的核電站,受9級(jí)特大地震影響吃衅,放射性物質(zhì)發(fā)生泄漏往踢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一徘层、第九天 我趴在偏房一處隱蔽的房頂上張望峻呕。 院中可真熱鬧,春花似錦趣效、人聲如沸瘦癌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讯私。三九已至,卻和暖如春西傀,著一層夾襖步出監(jiān)牢的瞬間斤寇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工拥褂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娘锁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓饺鹃,卻偏偏與公主長(zhǎng)得像莫秆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悔详,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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