- Activity 和 Fragment 都实现了 LifecycleOwner 接口
1、疑问
- 如何通过实现 LifeCycleOwner 接口,使 LiveData 能观察到 Activity/Fragment 的生命周期变化?
2、分析
- 以 ComponentActivity 为例
@RestrictTo(LIBRARY_GROUP)
public class ComponentActivity extends Activity implements LifecycleOwner {
...
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);// 1
@Override
@SuppressWarnings("RestrictedApi")
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);// 2
}
@CallSuper
@Override
protected void onSaveInstanceState(Bundle outState) {
mLifecycleRegistry.markState(Lifecycle.State.CREATED);// 3
super.onSaveInstanceState(outState);
}
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;// 4
}
...
}
- 2:onCreate 方法,调用了 ReportFragment.injectIfNeededIn
- 3:onSaveInstanceState,调用了 LifecycleRegistry.markState
2:onCreate——ReportFragment.injectIfNeededIn
@RequiresApi(29)
static class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
static void registerIn(Activity activity) {
activity.registerActivityLifecycleCallbacks(new LifecycleCallbacks());
}
@Override
public void onActivityCreated(@NonNull Activity activity,
@Nullable Bundle bundle) {
}
@Override
public void onActivityPostCreated(@NonNull Activity activity,
@Nullable Bundle savedInstanceState) {
dispatch(activity, Lifecycle.Event.ON_CREATE);
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
}
@Override
public void onActivityPostStarted(@NonNull Activity activity) {
dispatch(activity, Lifecycle.Event.ON_START);
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
}
@Override
public void onActivityPostResumed(@NonNull Activity activity) {
dispatch(activity, Lifecycle.Event.ON_RESUME);
}
@Override
public void onActivityPrePaused(@NonNull Activity activity) {
dispatch(activity, Lifecycle.Event.ON_PAUSE);
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
}
@Override
public void onActivityPreStopped(@NonNull Activity activity) {
dispatch(activity, Lifecycle.Event.ON_STOP);
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity,
@NonNull Bundle bundle) {
}
@Override
public void onActivityPreDestroyed(@NonNull Activity activity) {
dispatch(activity, Lifecycle.Event.ON_DESTROY);
}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
}
}
-
在生命周期的回调中,都调用了 dispatch 方法
-
调用了 LifeCycleRegister.handleLifecycleEvent 方法
-
moveToState:负责更新到最新状态
-
sync:根据当前状态和 mObserverMap 中的 eldest 和 newest 的状态做对比 ,判断当前状态是向前 forwardPass 还是向后 backwardPass,在这两个方法内部都调用了其静态内部类 ObserverWithState.dispatchEvent 方法
-
在 ObserverWithState.dispatchEvent 方法中,会调用 LifecycleEventObserver.onStateChanged 方法
现在,我们需要去追溯在这里,LifecycleEventObserver 接口具体的实现类是谁?
- ObserverWithState 的初始化的唯一地方在 LifecycleRegistry.addObserver 方法中
- LifecycleRegistry.addObserve,在 LiveData.observe 中被调用
- 由上诉可得出,ObserverWithState.mLifecycleObserver 指的是 LifecycleBoundObserver。故最后会执行到 LifecycleBoundObserver.onStateChanged 方法
- activeStateChanged 最后会调用到 considerNotify 分发数据
让我们再看看3:ComponentActivity.onSaveInstanceState
- 后续执行过程同上