JetPack---Lifecycle生命周期感知組件

一、概述
Lifecycle作為2017Google I/O大會作為架構組件Android Architecture Component(AAC)的一部分被共同發(fā)布出來。它是用于響應生命周期狀態(tài)的變化,能夠幫助編寫更加簡潔的Activity/Fragment代碼。
https://developer.android.com/topic/libraries/architecture/index.html

二、簡介及基礎使用
為什么要引入Lifecycle?
在編寫Activity代碼時捶牢,通常會遇到在Activity/Fragment生命周期中鸠珠,注冊與反注冊監(jiān)聽。例如下面的示例

class MyListener(val context: Context) {

    fun create() {
        //do something
    }

    fun destroy() {
        //do something
    }
}
class MainActivity : AppCompatActivity() {

    lateinit var listener: MyListener

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        listener = MyListener(this)
        listener.create()
    }

    override fun onDestroy() {
        super.onDestroy()
        listener.destroy()
    }
}

這段代碼本身沒有任何問題秋麸,但是在實際中渐排,監(jiān)聽可能不止一個,各個生命周期方法中的代碼也會很臃腫且復雜灸蟆。
解決方法
使用Lifecycle,它能夠知道生命周期的變化驯耻,這樣我們可以將上面的代碼改成下面這樣。
1.實現(xiàn)LifecycleObserver接口炒考,此接口為空方法接口
2.使用@OnLifecycleEvent()對方法進行注解可缚,注解后,只要執(zhí)行到相關的生命周期斋枢,方法就會被調(diào)用

class MyListener(val context: Context, val lifecycleOwner: LifecycleOwner) : LifecycleObserver {

    private val TAG = "MyListener"

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun create() {
        Log.i(TAG, "create: ")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun destroy() {
        Log.i(TAG, "destroy: ")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    fun onChange() {
        Log.i(TAG, "onChange: " + lifecycleOwner.lifecycle.currentState.name)
    }
}
//而在Activity中的代碼變成了下面這樣
class MainActivity : AppCompatActivity() {

    lateinit var listener: MyListener

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        listener = MyListener(this)
        lifecycle.addObserver(listener)
    }

    override fun onDestroy() {
        super.onDestroy()
    }
}

運行后的Log打印

2020-12-12 22:59:47.063 28675-28675/com.six.czh.architecture I/MyListener: create: 
2020-12-12 22:59:49.569 28675-28675/com.six.czh.architecture I/MyListener: destroy: 

在使用了Lifecycle后帘靡,可以看到Activity的代碼無需再在各個生命周期中進行監(jiān)聽器的創(chuàng)建和銷毀,將創(chuàng)建和銷毀責任拋到了監(jiān)聽器中杏慰,實現(xiàn)了解耦测柠。從log中也可以看到在生命周期發(fā)生變化時,監(jiān)聽器的方法就會被調(diào)用缘滥。除了onCreate和onDestroy外其它生命周期也可以監(jiān)聽到。如下

    @SuppressWarnings("WeakerAccess")
    public enum Event {
        /**
         * Constant for onCreate event of the {@link LifecycleOwner}.
         */
        ON_CREATE,
        /**
         * Constant for onStart event of the {@link LifecycleOwner}.
         */
        ON_START,
        /**
         * Constant for onResume event of the {@link LifecycleOwner}.
         */
        ON_RESUME,
        /**
         * Constant for onPause event of the {@link LifecycleOwner}.
         */
        ON_PAUSE,
        /**
         * Constant for onStop event of the {@link LifecycleOwner}.
         */
        ON_STOP,
        /**
         * Constant for onDestroy event of the {@link LifecycleOwner}.
         */
        ON_DESTROY,
        /**
         * An {@link Event Event} constant that can be used to match all events.
         */
        ON_ANY
    }

三谒主、簡單原理解析1

Lifecycle組件類圖

對于Lifecycle來講:有兩個很重要的接口是:
LifecycleObserver:生命周期觀察者朝扼,實現(xiàn)了該接口的類,通過@OnLifecycleEvent注解的方式霎肯,可以通過被LifecycleOwner類的addObserver(LifecycleObserver o)方法注冊,被注冊后擎颖,LifecycleObserver便可以觀察到LifecycleOwner的生命周期事件。

LifecycleOwner:生命周期所有者观游,實現(xiàn)該接口的類持有會持有Lifecycle對象搂捧,該類中生命周期的改變會被其注冊的觀察者LifecycleObserver觀察到并觸發(fā)其對應的事件。

Lifecycle:LifecycleOwner本身持有Lifecycle對象懂缕,LifecycleOwner通過其Lifecycle getLifecycle()的接口獲取內(nèi)部Lifecycle對象允跑。Lifecycle的默認實現(xiàn)類為LifecycleRegistry,一般如果需要自定義LifecycleOwner時搪柑,無需再自行實現(xiàn)Lifecycle聋丝。直接使用LifecycleRegistry即可。

State:當前Lifecycle對象所處的狀態(tài)

Event:當狀態(tài)發(fā)出改變時,所發(fā)出的事件工碾。

在Fragment中LifeCycle的時序圖1

Fragment中的時序圖

1.在Fragment通過getLifecycle方法獲取到LifecycleRegistry對象后弱睦,使用addObserver方法將實現(xiàn)了LifecycleObserver對象添加到觀察者中就可以在Fragment的生命周期變化之后,收到相關的事件渊额。
2.可以看到在onCreate况木、onStart垒拢、onResume中,F(xiàn)ragment的生命周期是要在lifeCycle事件之前的火惊,而在onPause求类、onStop、onDestroy中矗晃,F(xiàn)ragment的生命周期是要在lifeCycle事件之后

四仑嗅、常見問題
1.為什么在Activity/Fragment中無需自行實現(xiàn)LifeCyclerOwner?
答:從Android Suport 26.1開始,AppCompatActivity/Fragment已經(jīng)實現(xiàn)了LifecyclerOwner张症。因此無需自行實現(xiàn)仓技。(Activity未實現(xiàn))
2.LifeCycle中Event和State的區(qū)別?
答:Event:從Lifecycle對象分發(fā)的時間俗他,值對應著Activity/Fragment的生命周期脖捻,

State:Lifecycle對象本身的狀態(tài),例:如果Lifecycle當前狀態(tài)為DESTROYED的話兆衅,是不會收到LifeCycleOwner的任何生命周期事件


構成Activity生命周期的狀態(tài)和事件

3.Lifecycle可以在Service中使用嗎地沮?
答:可以,引入下面的庫即可羡亩。繼承LifecycleService即可

implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version"

除此之外摩疑,還可以自定義類通過實現(xiàn)LifecyclerOwner接口作為生命周期的所有者。后續(xù)只需要通過Lifecycle的將觀察者

五畏铆、總結
Lifecycle組件作為一個相對獨立的組件雷袋,能夠獨立的應用在現(xiàn)有代碼中。并且能與其它的組件結合辞居,從而可以更加簡潔的處理生命周期楷怒。

[1]Android 架構組件(一)——Lifecycle

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者瓦灶。
  • 序言:七十年代末鸠删,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贼陶,更是在濱河造成了極大的恐慌刃泡,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件每界,死亡現(xiàn)場離奇詭異捅僵,居然都是意外死亡,警方通過查閱死者的電腦和手機眨层,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門庙楚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人趴樱,你說我怎么就攤上這事馒闷±壹瘢” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵纳账,是天一觀的道長逛薇。 經(jīng)常有香客問我,道長疏虫,這世上最難降的妖魔是什么永罚? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮卧秘,結果婚禮上呢袱,老公的妹妹穿的比我還像新娘。我一直安慰自己翅敌,他們只是感情好羞福,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚯涮,像睡著了一般治专。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遭顶,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天张峰,我揣著相機與錄音,去河邊找鬼棒旗。 笑死挟炬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的嗦哆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼婿滓,長吁一口氣:“原來是場噩夢啊……” “哼老速!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凸主,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤橘券,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卿吐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旁舰,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年嗡官,在試婚紗的時候發(fā)現(xiàn)自己被綠了箭窜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡衍腥,死狀恐怖磺樱,靈堂內(nèi)的尸體忽然破棺而出纳猫,到底是詐尸還是另有隱情,我是刑警寧澤竹捉,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布芜辕,位于F島的核電站,受9級特大地震影響块差,放射性物質(zhì)發(fā)生泄漏侵续。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一憨闰、第九天 我趴在偏房一處隱蔽的房頂上張望状蜗。 院中可真熱鬧,春花似錦起趾、人聲如沸诗舰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眶根。三九已至,卻和暖如春边琉,著一層夾襖步出監(jiān)牢的瞬間属百,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工变姨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留族扰,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓定欧,卻偏偏與公主長得像渔呵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子砍鸠,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

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