mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
}
void performStart() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
}
void performResume() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
}
void performPause() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
}
void performStop() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
}
void performDestroy() {
mChildFragmentManager.dispatchDestroy();
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
//······
}
}
我们注册 Lifecycle 的时候,实际上都注册到 LifecycleRegistry 里面去了。通过 handleLifecycleEvent() 分发自己的状态到每个观察者,从而实现观察生命周期实现变化的能力。看起来简单实际上 Lifecycle 在分发生命周期的时候并不简单,所有逻辑重点都在 LifecycleRegistry。
Fragment 是如何派发生命周期的?也就是它会在自己生命周期里面,让 LifecycleRegistry 去分发生命周期事件,给每一个观察者。但是 Activity 中并不是这么做的。
2.Activity是如何是实现Lifecycle的
Activity 实现 Lifecycle 的核心源码,需要来到 ComponentActivity 里面,同样也是实现了 LifecycleOwner 接口:
public class ComponentActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
//复写getLifecycle(),返回LifecycleRegistry对象
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//往Activity上添加一个fragment,用以报告生命周期的变化
//目的是为了兼顾不是继承自AppCompactActivity的场景
ReportFragment.injectIfNeededIn(this);
}
}
与上面 Fragment 的实现类似,它实现了 LifecycleOwner,表示一个生命周期的宿主,必须实现 getLifecycle() 方法,返回一个 Lifecycle,也就是 LifecycleRegistry。
但是在 ComponentActivity 里面并没有在它的每个生命周期方法里面把它的状态分发给一个观察者,但是在 onCreate() 方法里面调用 ReportFragment.injectIfNeededIn(this) 这种做法实际上是往自己里面添加了一个不可见的 Fragment,专门用于报告分发给每个观察者。
public class ReportFragment extends Fragment {
public static void injectIfNeededIn (Activity activity) {
if (Build.VERSION.SDK_INT >= 29) {
// API 29 以上可以直接注册正确的生命周期回调
activity.registerActivityLifecycleCallbacks(
new LifecycleCallbacks ()
);
}
// 兼容API 29之前的,需要支持直接继承Activity的,使用Fragment来正确获得生命周期事件
android.app.FragmentManager manager = activity . getFragmentManager ();
if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
manager.beginTransaction().add(new ReportFragment (), REPORT_FRAGMENT_TAG).commit();
manager.executePendingTransactions();
}
}
}
所以 Activity 事件的分发是依靠 ReportFragment
来完成的。
- API 29 以下: 主要是通过
ReportFragment
将自身添加到 Activity 中实现。 - API 29 及以上:Activity 中增加一组
ActivityLifecycleCallbacks
的相关方法,可以直接通过注册ActivityLifecycleCallbacks
观察生命周期。
ComponentActivity 为什么这么做而不直接在 Activity 内部直接分发呢?主要是为了兼顾不是继承自 AppCompatActivity 的场景。有可能是直接继承自 Activity,然后自己实现了 Lifecycle 接口。
public class ReportFragment extends Fragment {
// 增加dispatch重载,尝试获取Activity中的LifecycleRegistry并调用 handleLifecycleEvent
static void dispatch(@NonNull Activity activity, @NonNull Lifecycle.Event event) {
if (activity instanceof LifecycleRegistryOwner) {
((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
return;
}
if (activity instanceof LifecycleOwner) {
Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
if (lifecycle instanceof LifecycleRegistry) {
((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
}
}
}
// 2.各个生命周期方法里面都调用了dispatch()方法
@Override
public void onStart() {
super.onSt