Android Jetpack 之 Lifecycles ---入門使用

前言

最近在學(xué)習(xí) Google 推出的框架Jetpack巢钓,雖然目前網(wǎng)上的資料已經(jīng)很多了瀑焦,但為了加深印象和邊動(dòng)手練習(xí)跟著學(xué)習(xí),所以站在了下面的巨人的肩膀上,并根據(jù)當(dāng)前最新的API 和編寫實(shí)際Demo,記錄下一些學(xué)習(xí)筆記,大部分是參考巨人們的裆甩,整理和休整,加入自己理解和更新吧齐唆,學(xué)習(xí)領(lǐng)略了Android Jetpack組件的一點(diǎn)魅力

目前學(xué)習(xí)筆記系列為:

日常鳴謝巨人

Google官方博文

CSDN 博主Alex@W

正題

Lifecycle 簡(jiǎn)介

Lifecycle 是一個(gè)持有組件生命周期信息的類嗤栓,并允許其他對(duì)象觀察此狀態(tài)

生命周期使用兩個(gè)主要枚舉來跟蹤其關(guān)聯(lián)組件的生命周期狀態(tài)

  1. Event - 從框架和Lifecycle 類派發(fā)的生命周期事件, 這些事件映射到activity 和fragment 中的回調(diào)事件

  2. State - 由 Lifecycle 對(duì)象跟蹤的組件的當(dāng)前狀態(tài)

Lifecycles 使用場(chǎng)景

生命周期感知組件箍邮,從名字中就可以知道茉帅,主要是用來是處理生命周期的相關(guān)的操作

在平時(shí)的開發(fā)過程中,我們難免有些邏輯的執(zhí)行是和UI的生命周期相結(jié)合的锭弊,需要在特定的生命周期中執(zhí)行相應(yīng)的方法堪澎,我們平時(shí)做的可能就是在View中的每個(gè)周期調(diào)用Present中獲取數(shù)據(jù)的方法,然后在調(diào)用View的回調(diào)接口更新UI

但現(xiàn)在使用Lifecycles可以使用注解和觀察的模式自動(dòng)調(diào)用Observe中定義好的方法味滞,也就是 Android Jetpack 中的 Lifecycles

Lifecycles 的基本使用步驟

1. gradle的引入(以Kotlin語(yǔ)言為例)

Project -> build.gradle

    repositories {
        google()
    }

Module -> build.gradle

    def lifecycle_version = "2.0.0"

    // alternatively - Lifecycles only (no ViewModel or LiveData). Some UI
    //     AndroidX libraries use this lightweight import for Lifecycle
    implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"
    
    // For Kotlin use kapt instead of annotationProcessor
    annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
    // alternately - if using Java8, use the following instead of lifecycle-compiler
    implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

2. 創(chuàng)建MyObserver

    class MyObserver(var lifecycle: Lifecycle, var myLifecyckleCallback: MyLifecyckleCallback) : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public fun connectOnCreate() {
        println("OnCreate")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public fun connectOnResume() {
        println("OnResume")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public fun connectOnStart() {
        println("OnStart")
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public fun connectOnDestory() {
        println("OnDestory")
    }

    fun println(string: String) {
        myLifecyckleCallback.update(string)
    }
}

3. 創(chuàng)建Activity并實(shí)現(xiàn)LifecyclesOwner

    class MyLifeCycleActivity : AppCompatActivity() {

    private lateinit var lifecycleRegistry: LifecycleRegistry
    private lateinit var myObserver: MyObserver

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        lifecycleRegistry = LifecycleRegistry(this)
        lifecycleRegistry.markState(Lifecycle.State.CREATED)

        myObserver = MyObserver(lifecycleRegistry, object : MyLifecyckleCallback {
            override fun update(string: String) {
                Toast.makeText(this@MyLifeCycleActivity, string, Toast.LENGTH_SHORT).show()
            }
        })
        lifecycleRegistry.addObserver(myObserver)
    }

    override fun onStart() {
        super.onStart()
        lifecycleRegistry.markState(Lifecycle.State.STARTED)
    }

    override fun onResume() {
        super.onResume()
        lifecycleRegistry.markState(Lifecycle.State.RESUMED)
    }

    override fun onStop() {
        super.onStop()
        lifecycleRegistry.markState(Lifecycle.State.DESTROYED)
    }

    override fun onDestroy() {
        super.onDestroy()
        lifecycleRegistry.markState(Lifecycle.State.DESTROYED)
    }

    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }
    }

因?yàn)?6.1.0 高版本后的 Activity 已經(jīng)實(shí)現(xiàn)了LifecycleOwner 接口

所以樱蛤,這里不用再實(shí)現(xiàn)該接口

如果是有其他類需要實(shí)現(xiàn)這樣的功能,需要實(shí)現(xiàn) LifecycleOwner 接口剑鞍,類似如下

class MyActivity : Activity(), LifecycleOwner {

    private lateinit var lifecycleRegistry: LifecycleRegistry

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        lifecycleRegistry = LifecycleRegistry(this)
        lifecycleRegistry.markState(Lifecycle.State.CREATED)
    }

    public override fun onStart() {
        super.onStart()
        lifecycleRegistry.markState(Lifecycle.State.STARTED)
    }

    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }
}

4. 創(chuàng)建LifecycleRegistry昨凡,如果實(shí)現(xiàn)了已經(jīng)實(shí)現(xiàn)了LifecycleOwner 接口,并返回lifecycleRegistry

    private lateinit var lifecycleRegistry: LifecycleRegistry
    
    lifecycleRegistry = LifecycleRegistry(this)
    
    
    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }

5. 實(shí)例化創(chuàng)建MyObserver蚁署,綁定Lifecycles便脊,并綁定 Lifecycle

    private lateinit var myObserver: MyObserver
    
    
    myObserver = MyObserver(lifecycleRegistry, object : MyLifecyckleCallback {
        override fun update(string: String) {
            Toast.makeText(this@MyLifeCycleActivity, string, Toast.LENGTH_SHORT).show()
        }
    })
    
    lifecycleRegistry.addObserver(myObserver)

6. 在生命周期中設(shè)置相應(yīng)的標(biāo)記

    lifecycleRegistry.markState(Lifecycle.State.STARTED)

    ....

    lifecycleRegistry.markState(Lifecycle.State.RESUMED)

7. 上述輔助接口

    interface MyLifecyckleCallback     {
        fun update(string: String)
    }

內(nèi)部概要實(shí)現(xiàn)過程

系統(tǒng)提供了Activity每個(gè)生命周期對(duì)應(yīng)的Event,而Event有會(huì)有對(duì)應(yīng)的State

//生命周期Event
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
    }
 
 //5個(gè)對(duì)應(yīng)的生命周期狀態(tài)
 public enum State {
 
        DESTROYED,
 
        INITIALIZED,
 
        CREATED,
 
        STARTED,
 
        RESUMED;
 
        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }
  • 使用 OnLifecycleEvent 標(biāo)記每個(gè)執(zhí)行方法的Event
  • 當(dāng)活動(dòng)狀態(tài)改變時(shí)光戈,系統(tǒng)會(huì)判斷即將要改變成的狀態(tài)
  • 根據(jù)狀態(tài)獲取要執(zhí)行的Event
  • 從注冊(cè)的Observer中獲取標(biāo)注為對(duì)應(yīng)的Event哪痰,執(zhí)行邏輯
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市久妆,隨后出現(xiàn)的幾起案子妒御,更是在濱河造成了極大的恐慌,老刑警劉巖镇饺,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乎莉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)惋啃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門哼鬓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人边灭,你說我怎么就攤上這事异希。” “怎么了绒瘦?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵称簿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我惰帽,道長(zhǎng)憨降,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任该酗,我火速辦了婚禮授药,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呜魄。我一直安慰自己悔叽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布爵嗅。 她就那樣靜靜地躺著娇澎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睹晒。 梳的紋絲不亂的頭發(fā)上趟庄,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音册招,去河邊找鬼岔激。 笑死勒极,一個(gè)胖子當(dāng)著我的面吹牛是掰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辱匿,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼键痛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了匾七?” 一聲冷哼從身側(cè)響起絮短,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昨忆,沒想到半個(gè)月后丁频,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年席里,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叔磷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奖磁,死狀恐怖改基,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咖为,我是刑警寧澤秕狰,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站躁染,受9級(jí)特大地震影響鸣哀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜褐啡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一诺舔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧备畦,春花似錦低飒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至莉恼,卻和暖如春拌喉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俐银。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工尿背, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捶惜。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓田藐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親吱七。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汽久,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345