1.Lifecycle作用
用于幫助開發(fā)者管理activity和Fragment的生命周期
2.基本使用
- 使用gitLifecycle獲取Lifecycle示例,然后使用addObserve()添加觀察者
- 觀察者實(shí)現(xiàn)LifecycleObserver,方法上使用OnLifecycleEvent注解關(guān)注對應(yīng)的生命周期,實(shí)名周期觸發(fā)時(shí)就會(huì)執(zhí)行對應(yīng)的執(zhí)行方法
public class LifecycleTestActivity extends AppCompatActivity {
private String TAG = "LifecycleTest";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lifecycle_test);
//Lifecycle 生命周期
getLifecycle().addObserver(new MyObserver());
Log.i(TAG, "onCreate: ");
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume: ");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause: ");
}
}
Activity是實(shí)名周期的擁有這,通過getLifecycle()來獲得生命周期的Lifecycle對象,Lifecycle對象使用addObserve來給自己添加一個(gè)觀察者,當(dāng)生命周期發(fā)生改變的時(shí)候,MyObserver就可以感知到。
下面來看看MyObserver對象
public class MyObserver implements LifecycleObserver {
private String TAG = "LifecycleTest";
@OnLifecycleEvent(value = Lifecycle.Event.ON_RESUME)
public void connect(){
Log.i(TAG, "connect: ");
}
@OnLifecycleEvent(value = Lifecycle.Event.ON_PAUSE)
public void disConnect(){
Log.i(TAG, "disConnect: ");
}
}
首先它實(shí)現(xiàn)了LifecycleObserver 接口,LifecycleObserver 是一個(gè)用于標(biāo)記生命周期的觀察者
然后在connectListener()、disconnectListener()上 分別都加了@OnLifecycleEvent注解,且value分別是Lifecycle.Event.ON_RESUME、Lifecycle.Event.ON_PAUSE,這個(gè)效果就是:connectListener()會(huì)在ON_RESUME時(shí)執(zhí)行,disconnectListener()會(huì)在ON_PAUSE時(shí)執(zhí)行
- 自定義 LifecycleOwner
在Activity中調(diào)用getLifecycle()能獲取到Lifecycle實(shí)例,那getLifecycle()是哪里定義的方法呢 ?是接口LifecycleOwner,顧明來思義,生命周期擁有者:
public interface LifecycleOwner {
@NonNull
Lifecycle getLifecycle();
}
在AndroidX的Fragment和Activity中以實(shí)現(xiàn)已實(shí)現(xiàn) LifecycleOwner 接口所以我們可以直接在Activity中使用getLifecycle()
那如果一個(gè)自定義類希望成為 LifecycleOwner,那么我們可以這么做
public class MyActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry lifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lifecycleRegistry = new LifecycleRegistry(this);
lifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@Override
public void onStart() {
super.onStart();
lifecycleRegistry.markState(Lifecycle.State.STARTED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return lifecycleRegistry;
}
}
MyActivity實(shí)現(xiàn)LifecycleOwner,getLifecycle()返回lifecycleRegistry實(shí)例。lifecycleRegistry實(shí)例則是在onCreate創(chuàng)建,并且在各個(gè)生命周期內(nèi)調(diào)用markState()方法完成生命周期事件的傳遞。這就完成了LifecycleOwner的自定義,也即MyActivity變成了LifecycleOwner,然后就可以和 實(shí)現(xiàn)了LifecycleObserver的組件配合使用了。
3.源碼分析
首先看一下Lifecycle中的兩種枚舉
package androidx.lifecycle;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
public abstract class Lifecycle {
@MainThread
public abstract void addObserver(@NonNull LifecycleObserver observer);
@MainThread
public abstract void removeObserver(@NonNull LifecycleObserver observer);
@MainThread
@NonNull
public abstract State getCurrentState();
@SuppressWarnings("WeakerAccess")
public enum Event {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY
}
@SuppressWarnings("WeakerAccess")
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
}
Lifecycle 使用兩種主要枚舉跟蹤其關(guān)聯(lián)組件的生命周期狀態(tài):
Event,生命周期事件,這些事件對應(yīng)Activity/Fragment生命周期方法。
State,生命周期狀態(tài),而Event是指進(jìn)入一種狀態(tài)的事件。
Event觸發(fā)的時(shí)機(jī):
- ON_CREATE、ON_START、ON_RESUME事件,是在LifecycleOwner對應(yīng)的方法執(zhí)行 之后 分發(fā)。
- ON_PAUSE、ON_STOP、ON_DESTROY事件,是在LifecycleOwner對應(yīng)的方法調(diào)用 之前 分發(fā)。
官網(wǎng)給的狀態(tài)轉(zhuǎn)移圖

3.1 Activity對LifecycleOwner的實(shí)現(xiàn)
首先一個(gè)時(shí)序圖送上

首先在ComponentActivity中是使用一個(gè)無界面的Fragment的來監(jiān)聽activity周期的所以首先是子啊ComponentActivity使用injectIfNeededIn來初始化Fragment并把當(dāng)前activity添加到FragmentManager中

然后通過diapath()調(diào)用ComponentActivity中的LifecycleRegistry的handleLifecycleEvent

在LifecycleRegistry中使用getStateAfter()獲取event發(fā)生之后的將要處于的狀態(tài)

獲取event發(fā)生之后的將要處于的狀態(tài)(看前面那張圖很好理解),moveToState()是移動(dòng)到新狀態(tài),最后使moveToState()是移動(dòng)到新狀態(tài),

最后使用sync()把生命周期狀態(tài)同步給所有觀察者

在同步到觀察者的時(shí)候使用的是反射

總結(jié):
LifecycleOwner(如Activity)在生命周期狀態(tài)改變時(shí)(也就是生命周期方法執(zhí)行時(shí)),遍歷觀察者,獲取每個(gè)觀察者的方法上的注解,如果注解是@OnLifecycleEvent且value是和生命周期狀態(tài)一致,那么就執(zhí)行這個(gè)方法。