美文网首页
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