jetapck 學(xué)習(xí) Lifecycle

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)移圖


image.png

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


image.png

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

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


image.png

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

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

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容