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是和生命周期状态一致,那么就执行这个方法。
网友评论