Lifecycle
是Google I/O
大會(huì)上發(fā)布的架構(gòu)組件,現(xiàn)階段正式版已經(jīng)推出莱衩。Lifecycle
是用于生命周期管理的一個(gè)組件蔚约。它可以減少內(nèi)存泄露和崩潰的可能性衡奥。同時(shí),生命周期庫(kù)是其他架構(gòu)組件(如 LiveData)的基礎(chǔ)吕喘,所以建議優(yōu)先擼它赘那。
如果需要配置請(qǐng)參考
相關(guān)Gradle配置參考
Lifecycle的基本使用
在傳統(tǒng)的MVP
中,如果需要在Presenter
類里面管理Activity
或者fragment
的生命周期大概就需要寫如下的代碼氯质,
/**
* Created by Hubery on 2018/7/1.
*/
class FirstActivity : AppCompatActivity() {
companion object {
val TAG = FirstActivity.javaClass.simpleName
}
private var mFirstPresenter: FirstPresenter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mFirstPresenter = FirstPresenter(this)
mFirstPresenter?.onCreate()
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "onDestroy()")
mFirstPresenter?.onDestroy()
}
}
interface IPresenter {
fun onCreate()
fun onDestroy()
}
class FirstPresenter(context:Context):IPresenter {
override fun onCreate() {
Log.d("FristPresenter","onCreate")
}
override fun onDestroy() {
Log.d("FristPresenter","onDestroy")
}
}
在這里為了簡(jiǎn)潔漓概,只實(shí)現(xiàn)了兩個(gè)生命周期,其他的生命周期同理病梢,先實(shí)現(xiàn)一個(gè)IPresenter
的接口胃珍,然后實(shí)現(xiàn)頁(yè)面的Presenter
代碼,如果需要保持和FirstActivity
生命周期一致蜓陌,需要分別的FirstActivity
生命周期里的每個(gè)方法里面去進(jìn)行回調(diào)觅彰。這樣寫比較麻煩,有沒有什么簡(jiǎn)潔的管理生命周期的方式钮热,答案是Lifecycle
填抬。
現(xiàn)在我們來(lái)看看Lifecycle
的實(shí)現(xiàn)方式:
interface IPresenter : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(owner: LifecycleOwner)
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy(owner: LifecycleOwner)
}
class CustomPresenter :IPresenter{
override fun onCreate(owner: LifecycleOwner) {
Log.d("BasePresenter","onCreate()")
}
override fun onDestroy(owner: LifecycleOwner) {
Log.d("BasePresenter","onDestroy()")
}
}
/**
* Created by Hubery on 2018/7/1.
*/
class FirstActivity : AppCompatActivity() {
companion object {
val TAG = FirstActivity.javaClass.simpleName
}
private var mPresenter: CustomPresenter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mPresenter = CustomPresenter(this)
getLifecycle().addObserver(mPresenter)
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "onDestroy()")
}
}
使用Lifecycle
在Activity
里面就一句getLifecycle().addObserver(mPresenter)
,就可以達(dá)到管理生命周期,這里需要注意的兩點(diǎn):
1隧期,這里的Activity
需要繼承AppCompatActivity
飒责;
2赘娄,這里的demo使用的java 7
寫IPresenter
接口的時(shí)候需要實(shí)現(xiàn)LifecycleObserver
通過(guò)注解的方式來(lái)接收生命周期的變化,而在java8
里面只需要去實(shí)現(xiàn)DefaultLifecycleObserver
宏蛉,然后重寫里面的生命周期方法即可遣臼。
Lifecycle基本原理
借鑒ShymanZhu的圖
LifecycleObserver
:Lifecycle
觀察者的角色,通過(guò)addObserver(@NonNull LifecycleObserver observer)
方法注冊(cè)拾并,java 7
中需要實(shí)現(xiàn)LifecycleObserver
是通過(guò)注解的方式來(lái)接收生命周期的變化揍堰,而在java 8
里面只需要去實(shí)現(xiàn)DefaultLifecycleObserver
,然后重寫里面的生命周期方法即可嗅义。注冊(cè)之后通過(guò)LifecycleObserver
便可以觀察到LifecycleOwner
中持有的Lifecycle
對(duì)象的生命周期變化屏歹。
LifecycleOwner
:LifecycleOwner
接口中,唯一定義的方法是getLifecycle()
,通過(guò)實(shí)現(xiàn)該接口就可以獲得Lifecycle
對(duì)象之碗,實(shí)現(xiàn)該接口的類持有生命周期(Lifecycle
對(duì)象)蝙眶。
Lifecycle
:Lifecycle
是一個(gè)抽象類且是生命周期類,它內(nèi)部定義了一個(gè)addObserver
添加事件褪那,removeObserver
移除事件械馆,getCurrentState
獲取當(dāng)前生命周期的狀態(tài),Event
事件和State
狀態(tài)的枚舉武通。
LifecycleRegistry
:Lifecycle
的實(shí)現(xiàn)類。
上面就是基本的類和接口的功能和作用之后珊搀,我們接下來(lái)看看Fragment
和他們之間的聯(lián)系冶忱。
Fragment
里面可以看到下面的代碼
LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
我們上面已經(jīng)說(shuō)過(guò)了,通過(guò)實(shí)現(xiàn)LifecycleOwner
重寫getLifecycle
方法是可以獲得Lifecycle
對(duì)象境析,而LifecycleRegistry
是Lifecycle
的實(shí)現(xiàn)類囚枪。
//下面的代碼省略了部分
void performStart() {
mState = STARTED;
onStart();
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
}
void performResume() {
mState = RESUMED;
onResume();
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
}
void performPause() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
mState = STARTED;
onPause();
}
//...
代碼比較多就不一一貼出來(lái)了,需要注意的是在這些生命周期里面劳淆,mLifecycleRegistry
放置的位置是有變化的链沼。
在Fragment
里面,在執(zhí)行不同的生命周期的時(shí)候沛鸵,會(huì)先調(diào)用performXX
方法括勺,然后在里面真正的執(zhí)行生命周期的XX
方法,并且會(huì)執(zhí)行mLifecycleRegistry
的handleLifecycleEvent
方法曲掰。
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
State next = getStateAfter(event);
moveToState(next);
}
handleLifecycleEvent
方法會(huì)通過(guò) getStateAfter
傳入當(dāng)前的狀態(tài)疾捍,并修改State
值,之后會(huì)遍歷FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap = new FastSafeIterableMap<>()
集合里面的元素栏妖,并 由LifecycleObserver
并同步且通知LifecycleOwner
改變生命周期乱豆。
mLifecycleObserver.onStateChanged(owner, event);
再次感謝ShymanZhu的時(shí)序圖:
在Fragment
拿到Lifecycle
生命周期,然后通過(guò)Observer
注冊(cè)監(jiān)聽吊趾,最后再生命周期過(guò)程中依次調(diào)用圖中的方法宛裕,這下是不是比較清晰了瑟啃。