導(dǎo)入
? ? ? ? 在Android中,組件的管理組件的生命周期一直是一個(gè)比較麻煩的東西瘸味,而自Google推出Android Jetpack組件包以來鹉勒,這個(gè)問題得到的比較妥善的解決拐格,Lifecycle組件后來也成為Android Jetpack的核心。以AndroidX為例(如何遷移請(qǐng)看遷移到AndroidX)俭缓,使用Lifecycle組件克伊,先在模塊的build.gradle文件中添加依賴:
api 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha02'
? ? ? ? 由于Lifecycle組件由多個(gè)包夠成,使用api導(dǎo)入時(shí)即可將其依賴的包全部導(dǎo)入該模塊华坦,包括common愿吹,livedata,process季春,runtime洗搂,viewmodel,service等载弄。
????????如果要使用lifecycle中的注解耘拇,你還需要添加如下注解處理器,以便在編譯時(shí)宇攻,完成對(duì)相應(yīng)注解的處理惫叛。
annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.0.0'
開始使用
? ? ? ? 對(duì)于一個(gè)App來說,使用Lifecycle組件是沒有任何侵入性的逞刷,因?yàn)樗呀?jīng)天然的融合到Google的appcompat庫中了嘉涌,而如今無論是什么應(yīng)用程序都幾乎離不開appcompat,可以說集成Lifecycle只是啟用了之前沒用過的功能罷了夸浅。
????????LifecycleOwner是Lifecycle組件包中最重要的一個(gè)接口仑最,所有需要管理生命周期的類型都必須實(shí)現(xiàn)這個(gè)接口。
public interface LifecycleOwner
{
/**
* Returns the Lifecycle of the provider.
*
* @return The lifecycle of the provider.
*/
@NonNull
Lifecycle getLifecycle();
}
? ? ? ? 其實(shí)很多時(shí)候我們根本無需關(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)目中突颊,只要繼承這些類型鲁豪,可以輕松的通過getLifecycle獲取到Lifecycle實(shí)例潘悼。
? ? ? ? 而Lifecycle這個(gè)類最重要的只有兩個(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è)枚舉類抽象出來定義在Lifecycle類中。
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)掷漱,是最開始時(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è)觀察者锦爵,來接收LifecycleOwner上的回調(diào)事件“侣悖回調(diào)事件也是一個(gè)枚舉险掀,定義在Lifecycle類中:
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)聽的生命周期回調(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)訪問權(quán)限或是public的叹螟,否則可能在編譯時(shí)會(huì)報(bào)錯(cuò),或者收不到回調(diào)台盯。
????????若想在運(yùn)行時(shí)移除LifecycleObserver罢绽,同樣也還有Lifecycle#removeObserver方法。