導(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方法。