源码之 LifeCycleOwner

文章目录

  • 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
在这里插入图片描述
在这里插入图片描述

  • 后续执行过程同上
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值