Android Jetpack开发:原理解析与应用实战
上QQ阅读APP看书,第一时间看更新

2.4 原理小课堂

在2.2.1节中已经讲解过,在androidx.core.app.ComponentActivity中默认实现了LifecycleOwner接口,getLifecycle返回的实际是一个LifecycleRegistry对象,LifecycleRegistry是Lifecycle的唯一实现类。Lifecycle抽象类中定义了添加观察者(addObserver)、移除观察者(removeObserver),以及获取当前状态(getCurrentState)的方法,这是典型的观察者模式,接下来看看ComponentActivity中都做了什么,代码如下:

@SuppressLint("RestrictedApi")
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ReportFragment.injectIfNeededIn(this);
}

可以看到,ComponentActivity中引入了一个ReportFragment,ReportFragment是一个无页面的Fragment,它是用来协助Activity处理任务的,那么这里为什么要引入ReportFragment呢?别着急,我们先来看看其中的injectIfNeededIn方法,代码如下:

public static void injectIfNeededIn(Activity activity) {
    //使用Fragment兼容处理不是继承自FragmentActivity的视图,确保ProcessLifecycleOwner可以正常工作
        android.app.FragmentManager manager = activity.getFragmentManager();
        if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
            manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
            // 希望立即执行
            manager.executePendingTransactions();
      }
}

通过源码注释可以看出,引入ReportFragment是为了兼容那些并不是直接继承自FragmentActivity的页面,这样它们就可以正常使用Lifecycle了。在Report-Fragment中可以看到对应生命周期的方法中都会执行dispatch方法,代码如下:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        dispatchCreate(mProcessListener);
        dispatch(Lifecycle.Event.ON_CREATE);
    }
    @Override
    public void onStart() {
        super.onStart();
        dispatchStart(mProcessListener);
        dispatch(Lifecycle.Event.ON_START);
    }
    @Override
    public void onResume() {
        super.onResume();
        dispatchResume(mProcessListener);
        dispatch(Lifecycle.Event.ON_RESUME);
    }
    @Override
    public void onPause() {
        super.onPause();
        dispatch(Lifecycle.Event.ON_PAUSE);
    }
    @Override
    public void onStop() {
        super.onStop();
        dispatch(Lifecycle.Event.ON_STOP);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        dispatch(Lifecycle.Event.ON_DESTROY);
        // 赋值为空,确保不会导致内存泄漏
    ocessListener = null;
    }

接下来看看dispatch方法的主要代码,具体如下:

private void dispatch(Lifecycle.Event event) {
    Activity activity = getActivity();
    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);
        }
    }
}

dispatch方法最终都会进入handleLifecycleEvent方法中,通过handleLifecycle-Event设置状态并通知观察者,Activity便能监听到生命周期的变化了。

注意

本节内容涉及大量源码解析,无法详细讲解,感兴趣的读者可按照上述思路自行解析。