美文网首页
jetapck 学习 Lifecycle

jetapck 学习 Lifecycle

作者: 刘景昌 | 来源:发表于2021-03-15 16:28 被阅读0次

    1.Lifecycle作用
    用于帮助开发者管理activity和Fragment的生命周期
    2.基本使用

    • 使用gitLifecycle获取Lifecycle示例,然后使用addObserve()添加观察者
    • 观察者实现LifecycleObserver,方法上使用OnLifecycleEvent注解关注对应的生命周期,实名周期触发时就会执行对应的执行方法
    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是实名周期的拥有这,通过getLifecycle()来获得生命周期的Lifecycle对象,Lifecycle对象使用addObserve来给自己添加一个观察者,当生命周期发生改变的时候,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: ");
        }
    }
    

    首先它实现了LifecycleObserver 接口,LifecycleObserver 是一个用于标记生命周期的观察者
    然后在connectListener()、disconnectListener()上 分别都加了@OnLifecycleEvent注解,且value分别是Lifecycle.Event.ON_RESUME、Lifecycle.Event.ON_PAUSE,这个效果就是:connectListener()会在ON_RESUME时执行,disconnectListener()会在ON_PAUSE时执行

    • 自定义 LifecycleOwner
      在Activity中调用getLifecycle()能获取到Lifecycle实例,那getLifecycle()是哪里定义的方法呢 ?是接口LifecycleOwner,顾明来思义,生命周期拥有者:
    public interface LifecycleOwner {
        @NonNull
        Lifecycle getLifecycle();
    }
    

    在AndroidX的Fragment和Activity中以实现已实现 LifecycleOwner 接口所以我们可以直接在Activity中使用getLifecycle()
    那如果一个自定义类希望成为 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实现LifecycleOwner,getLifecycle()返回lifecycleRegistry实例。lifecycleRegistry实例则是在onCreate创建,并且在各个生命周期内调用markState()方法完成生命周期事件的传递。这就完成了LifecycleOwner的自定义,也即MyActivity变成了LifecycleOwner,然后就可以和 实现了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 使用两种主要枚举跟踪其关联组件的生命周期状态:

    Event,生命周期事件,这些事件对应Activity/Fragment生命周期方法。
    State,生命周期状态,而Event是指进入一种状态的事件。
    Event触发的时机:

    • ON_CREATE、ON_START、ON_RESUME事件,是在LifecycleOwner对应的方法执行 之后 分发。
    • ON_PAUSE、ON_STOP、ON_DESTROY事件,是在LifecycleOwner对应的方法调用 之前 分发。

    官网给的状态转移图


    image.png

    3.1 Activity对LifecycleOwner的实现
    首先一个时序图送上


    image.png
    首先在ComponentActivity中是使用一个无界面的Fragment的来监听activity周期的所以首先是子啊ComponentActivity使用injectIfNeededIn来初始化Fragment并把当前activity添加到FragmentManager中
    image.png

    然后通过diapath()调用ComponentActivity中的LifecycleRegistry的handleLifecycleEvent


    image.png
    在LifecycleRegistry中使用getStateAfter()获取event发生之后的将要处于的状态
    image.png
    获取event发生之后的将要处于的状态(看前面那张图很好理解),moveToState()是移动到新状态,最后使moveToState()是移动到新状态,
    image.png
    最后使用sync()把生命周期状态同步给所有观察者
    image.png
    在同步到观察者的时候使用的是反射
    image.png

    总结:
    LifecycleOwner(如Activity)在生命周期状态改变时(也就是生命周期方法执行时),遍历观察者,获取每个观察者的方法上的注解,如果注解是@OnLifecycleEvent且value是和生命周期状态一致,那么就执行这个方法。

    相关文章

      网友评论

          本文标题:jetapck 学习 Lifecycle

          本文链接:https://www.haomeiwen.com/subject/awnhcltx.html