Lifecycle 的作用
Lifecycle是具有生命周期感知能力的組件,也就是說,我們能在 Activity 或者 Fragment 的生命周期發(fā)生變化的時(shí)候得到通知首量,我們往往會(huì)在Activity 的各種生命中周期方法里執(zhí)行特定的方法叹话,比如,進(jìn)行廣播的注冊(cè)和解綁粱年、Eventbus 的注冊(cè)和解綁等:
如果我們把很多這種需要跟生命周期相關(guān)的邏輯代碼都直接放在Activity 的生命周期方法中,Activity 將會(huì)變得難以維護(hù)罚拟。通過 Lifecycle台诗,我們就能避免這種問題。因?yàn)楸举|(zhì)上我們需要的只是Activity 或者 Fragment 的生命周期發(fā)生改變的時(shí)候能通知到我們赐俗,以便我們?cè)趯?duì)應(yīng)生命周期中執(zhí)行對(duì)應(yīng)的方法拉队。
Lifecycle 的基本使用
導(dǎo)入Lifecycle 依賴
Lifecycle被包含在 support library 26.1.0 及之后的依賴包中,如果我們的項(xiàng)目依賴的支持庫(kù)版本在 26.1.0及以上阻逮,那么不需要額外導(dǎo)入Lifecycle 庫(kù)
? implementation 'com.android.support:appcompat-v7:28.0.0'
如果支持庫(kù)版本小于26.1.0 粱快,就需要單獨(dú)導(dǎo)入 Lifecycle 庫(kù) :
? implementation "android.arch.lifecycle:runtime:1.1.1"
如果項(xiàng)目已經(jīng)遷移到了AndroidX,可以使用下面的方式引入 :
? implementation "androidx.lifecycle:lifecycle-runtime:2.0.0"
??? 建議大家嘗試盡快把項(xiàng)目遷移為AndroidX叔扼,因?yàn)楹芏喔率驴蓿瑫?huì)最先在AndroidX 中發(fā)布,逐漸擺脫傳統(tǒng)的support包瓜富。比如這里要講的 Lifecycle 在 AndroidX 中已經(jīng)升級(jí)到了 2.x版本鳍咱,而支持庫(kù)中還是 1.x 版本。
以 support library 版本在 26.1.0 及以上為前提与柑,這里我們分兩種情況來講谤辜。一種是我們創(chuàng)建的Activity 繼承自AppCompatActivity(以Activity 為例,F(xiàn)ragment類似)价捧,另一種是創(chuàng)建的Activity 繼承自普通的 Activity丑念,而非 AppCompatActivity。
Lifecycle的實(shí)現(xiàn)機(jī)制是觀察者模式结蟋,使用過程如下:
1. 構(gòu)建一個(gè)Lifecycle 對(duì)象(通過一個(gè)實(shí)現(xiàn)了 LifecycleOwner 接口的對(duì)象的 getLifecycle()方法返回)脯倚,這個(gè)對(duì)象就是一個(gè)被觀察者,具有生命周期感知能力
2. 構(gòu)建一個(gè)LifecycleObserver 對(duì)象嵌屎,它對(duì)指定的 Lifecycle 對(duì)象進(jìn)行監(jiān)聽
3. 通過將Lifecycle 對(duì)象的 addObserver(…) 方法挠将,將 Lifecycle 對(duì)象和 LifecycleObserver 對(duì)象進(jìn)行綁定胳岂。
1、 繼承自 AppCompatActivity
首先舔稀,我們創(chuàng)建一個(gè)MyObserver.java 類乳丰,讓它實(shí)現(xiàn) LifecycleObserver 接口( LifecycleObserver接口是一個(gè)空接口,主要是給注解處理器使用)内贮,如下
public class MyObserver implementsLifecycleObserver {
????? private static final String TAG = "MyObserver";
??? // 使用注解? @OnLifecycleEvent? 來表明該方法需要監(jiān)聽指定的生命周期事件
??? @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
??? public void connectListener() {
??????? //??????? ...
??????? Log.d(TAG,? "connectListener:? --------?? onResume" );
??? }
? @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
? public void disconnectListener() {
??????? //??????? ...
??????? Log.d(TAG, "disconnectListener:? -------?? onPause");
??? }
}
可以看到产园,我們通過在方法上使用@OnLifecycleEvent注解使得該方法具有了生命周期感知能力。Lifecycle主要就是通過 Event 和 State 這兩個(gè)枚舉類來跟蹤所關(guān)聯(lián)組件的生命周期狀態(tài)
接下來夜郁,讓我們的Activity 繼承自 AppCompatActivity什燕,然后在 onCreate(…)方法中通過getLifecycle().addObserver(new MyObserver())完成 Lifecycle和LifecycleObserver 的綁定
public class LifeCycleActivity extends AppCompatActivity {
??? @Override
? protected void onCreate(Bundle savedInstanceState) {
??????? super.onCreate(savedInstanceState);
??????? setContentView(R.layout.activity_main);
??????? // 就只需要這一行代碼,簡(jiǎn)潔吧
??????? getLifecycle().addObserver(new? MyObserver());
??? }
}
然后我們就可以運(yùn)行下程序竞端,切換到Home 也或者按返回鍵屎即,就能看到隨著生命周期的變化,MyObserver() 中定義的方法在控制臺(tái)中也被正確地打印了出來事富。
AppCompatActivity 的祖先類 SupportActivity已經(jīng)默認(rèn)實(shí)現(xiàn)了 LifecycleOwner 接口技俐,通過其 getLifecycle() 方法可以直接返回一個(gè)Lifecycle 對(duì)象
2、 繼承自普通的 Activity
我們需要自己實(shí)現(xiàn)LifecycleOwner接口统台,并在具體的生命周期下通過LifecycleRegistry 的 markState(...)方法來主動(dòng)進(jìn)行事件的分發(fā)
public class LifeCycleCommonActivity extends Activity implements LifecycleOwner {
???? private LifecycleRegistry mLifecycleRegistry;
???? @Override
???? protected void onCreate(Bundle savedInstanceState) {
????????? super.onCreate(savedInstanceState);
????????? setContentView(R.layout.activity_main);
??????? mLifecycleRegistry = new? LifecycleRegistry(this);
??????? getLifecycle().addObserver(new? MyObserver());
??????? mLifecycleRegistry.markState(Lifecycle.State.CREATED);
??? }
??? @Override
? protected void onResume() {
??????? super.onResume();
??????? mLifecycleRegistry.markState(Lifecycle.State.RESUMED);
??? }
??? @Override
? protected void onPause() {
??????? super.onPause();
??????? mLifecycleRegistry.markState(Lifecycle.State.STARTED);
??? }
??? @NonNull
??? @Override
? public Lifecycle getLifecycle() {
??????? return mLifecycleRegistry;
??? }
}
LifeCycleCommonActivity實(shí)現(xiàn)了LifecycleOwner接口(實(shí)現(xiàn)該接口的對(duì)象雕擂,即是Lifecycle 的持有者),并在其 getLifecycle( ) 方法中返回了一個(gè) LifecycleRegistry對(duì)象贱勃,而 LifecycleRegistry 是 Lifecycle 的子類井赌。其他使用方式,則完全相同贵扰。
為了讓使用更加方便靈活仇穗,Lifecycle還提供了查詢當(dāng)前組件所處的生命周期狀態(tài)的方法:
lifecycle.getCurrentState().isAtLeast(STARTED)