Android技術(shù)棧(三)Lifecycle組件

導(dǎo)入

? ? ? ? 在Android中,組件的管理組件的生命周期一直是一個(gè)比較麻煩的東西,而自Google推出Android Jetpack組件包以來(lái),這個(gè)問(wèn)題得到的比較妥善的解決,Lifecycle組件后來(lái)也成為Android Jetpack的核心。以AndroidX為例(如何遷移請(qǐng)看遷移到AndroidX),使用Lifecycle組件,先在模塊的build.gradle文件中添加依賴(lài):

api 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha02'

? ? ? ? 由于Lifecycle組件由多個(gè)包夠成,使用api導(dǎo)入時(shí)即可將其依賴(lài)的包全部導(dǎo)入該模塊,包括common,livedata,process,runtime,viewmodel,service等。

????????如果要使用lifecycle中的注解,你還需要添加如下注解處理器,以便在編譯時(shí),完成對(duì)相應(yīng)注解的處理。

annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.0.0'

開(kāi)始使用

? ? ? ? 對(duì)于一個(gè)App來(lái)說(shuō),使用Lifecycle組件是沒(méi)有任何侵入性的,因?yàn)樗呀?jīng)天然的融合到Google的appcompat庫(kù)中了,而如今無(wú)論是什么應(yīng)用程序都幾乎離不開(kāi)appcompat,可以說(shuō)集成Lifecycle只是啟用了之前沒(méi)用過(guò)的功能罷了。

????????LifecycleOwner是Lifecycle組件包中最重要的一個(gè)接口,所有需要管理生命周期的類(lèi)型都必須實(shí)現(xiàn)這個(gè)接口。

public interface LifecycleOwner

{

/**

* Returns the Lifecycle of the provider.

*

* @return The lifecycle of the provider.

*/

@NonNull

Lifecycle getLifecycle();

}

? ? ? ? 其實(shí)很多時(shí)候我們根本無(wú)需關(guān)心LifecycleOwner的存在。在Android中,?Fragment、Activity、Service都是具有生命周期的組件,但是Google已經(jīng)讓他們都實(shí)現(xiàn)了LifecycleOwner這個(gè)接口,分別是androdx.fragment.app.Fragment、AppCompatActivity、androidx.lifecycle.LifecycleService,在項(xiàng)目中,只要繼承這些類(lèi)型,可以輕松的通過(guò)getLifecycle獲取到Lifecycle實(shí)例。

? ? ? ? 而Lifecycle這個(gè)類(lèi)最重要的只有兩個(gè)方法:

@MainThread

public abstract void removeObserver(@NonNull LifecycleObserver observer);

@MainThread

@NonNull

public abstract State getCurrentState();

@MainThread

public abstract void addObserver(@NonNull LifecycleObserver observer);?

1.getCurrentState()可以返回當(dāng)前該LifecycleOwner的生命周期狀態(tài),該狀態(tài)與LifecycleOwner上的某些回調(diào)事件相關(guān),只會(huì)出現(xiàn)以下幾種狀態(tài),在Java中以一個(gè)枚舉類(lèi)抽象出來(lái)定義在Lifecycle類(lèi)中。

public enum State

{? ? ? ?

????????DESTROYED,

????????INITIALIZED,

????????CREATED,

????????STARTED,

????????RESUMED;

}

? ? ? ? 1.DESTROYED,在組件的onDestroy調(diào)用前夕,會(huì)變成該狀態(tài),變成此狀態(tài)后將不會(huì)再出現(xiàn)任何狀態(tài)改變,也不會(huì)發(fā)送任何生命周期事件

? ? ? ? 2.INITIALIZED,構(gòu)造函數(shù)執(zhí)行完成后但onCreate未執(zhí)行時(shí)為此狀態(tài),是最開(kāi)始時(shí)的狀態(tài)

? ? ? ? 3.CREATED,在onCreate調(diào)用之后,以及onStop調(diào)用前夕會(huì)變成此狀態(tài)

? ? ? ? 4.STARTED,在onStart調(diào)用之后,以及onPause調(diào)用前夕會(huì)變成此狀態(tài)

? ? ? ? 5.RESUMED,再onResume調(diào)用之后會(huì)變成此狀態(tài)

2.addObserver,此方法可以給LifecycleOwner添加一個(gè)觀察者,來(lái)接收LifecycleOwner上的回調(diào)事件。回調(diào)事件也是一個(gè)枚舉,定義在Lifecycle類(lèi)中:

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?

}


????????每種事件都對(duì)應(yīng)著Fragment/Activity中的事件。

? ? ? ? 至于LifecycleObserver,查看源碼得知,他就是一個(gè)空接口,不包含任何實(shí)現(xiàn),但是若我們想使用,還是得繼承此接口。

public interface LifecycleObserver

{

}

? ? ? ? 繼承LifecycleObserver,后使用@OnLifecycleEvent注解(這時(shí)之前申明得注解處理器派上了用場(chǎng)),并設(shè)置需要監(jiān)聽(tīng)的生命周期回調(diào)事件。

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)

public void test()

{

? ? ? ? ///TODO...

}

? ? ? ? 然后在Activity/Fragment中:

getLifecycle().addObserver(yourLifecycleObserver);

????????即可在運(yùn)行時(shí)收到相應(yīng)的的回調(diào)事件,但是注意添加@OnLifecycleEvent注解的方法應(yīng)該是包內(nèi)訪(fǎng)問(wèn)權(quán)限或是public的,否則可能在編譯時(shí)會(huì)報(bào)錯(cuò),或者收不到回調(diào)。

????????若想在運(yùn)行時(shí)移除LifecycleObserver,同樣也還有Lifecycle#removeObserver方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容