官术网_书友最值得收藏!

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便能監聽到生命周期的變化了。

注意

本節內容涉及大量源碼解析,無法詳細講解,感興趣的讀者可按照上述思路自行解析。

主站蜘蛛池模板: 白玉县| 西宁市| 雷州市| 太仆寺旗| 广德县| 无锡市| 屏东市| 大方县| 全州县| 龙游县| 通榆县| 沁水县| 仲巴县| 乌鲁木齐县| 宜阳县| 莫力| 兴安县| 林芝县| 大新县| 香港| 榆林市| 禹城市| 东明县| 申扎县| 邵东县| 大方县| 新野县| 新密市| 进贤县| 永城市| 建水县| 剑阁县| 兴仁县| 义乌市| 上杭县| 和龙市| 霍州市| 运城市| 萨迦县| 石城县| 开平市|