上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便能监听到生命周期的变化了。
注意
本节内容涉及大量源码解析,无法详细讲解,感兴趣的读者可按照上述思路自行解析。