一、概述
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來講:有兩個很重要的接口是:
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
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的任何生命周期事件
3.Lifecycle可以在Service中使用嗎地沮?
答:可以,引入下面的庫即可羡亩。繼承LifecycleService即可
implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version"
除此之外摩疑,還可以自定義類通過實現(xiàn)LifecyclerOwner接口作為生命周期的所有者。后續(xù)只需要通過Lifecycle的將觀察者
五畏铆、總結
Lifecycle組件作為一個相對獨立的組件雷袋,能夠獨立的應用在現(xiàn)有代碼中。并且能與其它的組件結合辞居,從而可以更加簡潔的處理生命周期楷怒。