前言
LifeCycle是Android官方提供的組件冕屯,可見地址:https://developer.android.com/topic/libraries/architecture/lifecycle
Lifecycle?是一個(gè)類窖壕,它持有關(guān)于組件(如 Activity 或 Fragment)生命周期狀態(tài)的信息寄悯,并且允許其他對(duì)象觀察此狀態(tài)冠胯。
以下是閱讀官網(wǎng)的說明:
LifeCycle指的是使用生命周期通知組件去處理生命周期哩陕。
支持生命周期的組件執(zhí)行操作以響應(yīng)另一個(gè)組件(例如活動(dòng)和片段)的生命周期狀態(tài)更改驮捍。這些組件可幫助您生成組織性更好罩润,并且通常重量更輕的代碼玖翅,這些代碼更易于維護(hù)。
常見的模式是在activity和fragment的生命周期方法中實(shí)現(xiàn)依賴組件的操作割以。但是金度,這種模式導(dǎo)致代碼的組織不良以及錯(cuò)誤泛濫。通過使用生命周期感知組件严沥,您可以將相關(guān)組件的代碼從生命周期方法中移出并移入組件本身猜极。
該android.arch.lifecycle?軟件包提供了類和接口,使您可以構(gòu)建支持生命周期的?組件消玄,這些組件可以根據(jù)activity或fragment的當(dāng)前生命周期狀態(tài)自動(dòng)調(diào)整其行為跟伏。
注意:要導(dǎo)入?android.arch.lifecycle?到您的Android項(xiàng)目中
為什么要用LifeCycle
我們在處理activity或者fragment的生命周期時(shí),不可避免會(huì)遇到這樣的情況:在activity的oncreate中初始化某些成員變量翩瓜,在onstop中釋放或者銷毀受扳。實(shí)際開發(fā)中會(huì)導(dǎo)致oncreate onstop中的代碼非常臃腫。
LifeCycle使用說明
舉例使用mvp模式說明:
1兔跌、新建工程
在project的build.gradle中添加
maven {
? ? ? ? ? ? url 'https://maven.google.com'
? ? ? ? }
官網(wǎng)上寫的是google()勘高,但是google()需要gradle 4.0才支持
2、要觀察到Presenter的生命周期事件都列了出來浮定,封裝到BasePresenter 中相满,只要繼承了BasePresenter 的子類都能感知到Activity容器對(duì)應(yīng)的生命周期事件层亿,并在子類重寫對(duì)應(yīng)的行為代碼
public interface IPresenter extends LifecycleObserver {
? ? @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
? ? void onCreate(@NotNull LifecycleOwner owner);
? ? @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
? ? void onDestory(@NotNull LifecycleOwner owner);
? ? @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
? ? void onLifeCycleChanged(@NotNull LifecycleOwner owner, @NotNull Lifecycle.Event event);
}
public class BasePresenter implements IPresenter {
? ? @Override
? ? public void onCreate(@NotNull LifecycleOwner owner) {
? ? }
? ? @Override
? ? public void onDestory(@NotNull LifecycleOwner owner) {
? ? }
? ? @Override
? ? public void onLifeCycleChanged(@NotNull LifecycleOwner owner, @NotNull Lifecycle.Event event) {
? ? }
}
public class MainPresenter extends BasePresenter {
? ? private final String TAG = MainPresenter.class.getName();
? ? private Context context;
? ? public MainPresenter(Context context) {
? ? ? ? this.context = context;
? ? }
? ? @Override
? ? public void onCreate(@NotNull LifecycleOwner owner) {
? ? ? ? super.onCreate(owner);
? ? ? ? Log.d(TAG, "LifeCycle------onCreate------");
? ? }
? ? @Override
? ? public void onDestory(@NotNull LifecycleOwner owner) {
? ? ? ? super.onDestory(owner);
? ? ? ? Log.d(TAG, "LifeCycle------onDestory------");
? ? }
}
3桦卒、在Activity/Fragment容器中添加Observer:
public class MainActivity extends AppCompatActivity {
? ? private IPresenter mPresenter;
? ? private final String TAG = MainActivity.class.getName();
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? Log.d(TAG, "MainActivity------onCreate------");
? ? ? ? mPresenter = new MainPresenter(this);
? ? ? ? getLifecycle().addObserver(mPresenter);//添加LifecycleObserver
? ? }
? ? @Override
? ? protected void onDestroy() {
? ? ? ? super.onDestroy();
? ? ? ? Log.d(TAG, "MainActivity------onDestroy------");
? ? }
}
這樣的話,每當(dāng)Activity發(fā)生了對(duì)應(yīng)的生命周期改變匿又,Presenter就會(huì)執(zhí)行對(duì)應(yīng)事件注解的方法
除onCreate和onDestroy事件之外方灾,Lifecycle一共提供了所有的生命周期事件,只要?
通過注解進(jìn)行聲明碌更,就能夠使LifecycleObserver觀察到對(duì)應(yīng)的生命周期事件:
原理說明
網(wǎng)上的圖
LifecycleObserver接口( Lifecycle觀察者):實(shí)現(xiàn)該接口的類裕偿,通過注解的方式,可以通過被LifecycleOwner類的addObserver(LifecycleObserver o)方法注冊,被注冊后痛单,LifecycleObserver便可以觀察到LifecycleOwner的生命周期事件嘿棘。
LifecycleOwner接口(Lifecycle持有者):實(shí)現(xiàn)該接口的類持有生命周期(Lifecycle對(duì)象),該接口的生命周期(Lifecycle對(duì)象)的改變會(huì)被其注冊的觀察者LifecycleObserver觀察到并觸發(fā)其對(duì)應(yīng)的事件旭绒。
Lifecycle(生命周期):和LifecycleOwner不同的是鸟妙,LifecycleOwner本身持有Lifecycle對(duì)象焦人,LifecycleOwner通過其Lifecycle getLifecycle()的接口獲取內(nèi)部Lifecycle對(duì)象。
State(當(dāng)前生命周期所處狀態(tài)):如圖所示重父。
Event(當(dāng)前生命周期改變對(duì)應(yīng)的事件):如圖所示花椭,當(dāng)Lifecycle發(fā)生改變,如進(jìn)入onCreate,會(huì)自動(dòng)發(fā)出ON_CREATE事件房午。
以SupportActivity(AppCompatActivity extends SupportActivity)為例矿辽,SupportActivity實(shí)現(xiàn)了LifecycleOwner接口,這意味著SupportActivity對(duì)象持有生命周期對(duì)象(Lifecycle)郭厌,并可以通過Lifecycle getLifecycle()方法獲取內(nèi)部的Lifecycle對(duì)象
可以看到袋倔,實(shí)現(xiàn)的getLifecycle()方法,實(shí)際上返回的是?LifecycleRegistry?對(duì)象折柠,LifecycleRegistry對(duì)象實(shí)際上繼承了?Lifecycle奕污,這個(gè)下文再講。
持有Lifecycle有什么作用呢液走?實(shí)際上在SupportActivity( ReportFragment.injectIfNeededIn())對(duì)應(yīng)的生命周期內(nèi)碳默,都會(huì)發(fā)送對(duì)應(yīng)的生命周期事件給內(nèi)部的?LifecycleRegistry對(duì)象處理,內(nèi)部的Lifecycle對(duì)象(就是mLifecycleRegistry)將生命周期對(duì)應(yīng)的事件作為參數(shù)傳給了?handleLifecycleEvent()?方法
handleLifecycleEvent方法會(huì)通過 getStateAfter 獲取當(dāng)前應(yīng)處的狀態(tài)并修改 Lifecycle本身的State 值缘眶,緊接著遍歷所 LifecycleObserver 并同步且通知其狀態(tài)發(fā)生變化嘱根,因此就能觸發(fā)LifecycleObserver 對(duì)應(yīng)的生命周期事件。
總結(jié)
Lifecycle簡單且獨(dú)立(實(shí)際上配合其他組件味道更佳)巷懈。