書名: Android Jetpack開發:原理解析與應用實戰作者名: 黃林晴本章字數: 548字更新時間: 2022-07-05 09:43:57
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便能監聽到生命周期的變化了。
注意
本節內容涉及大量源碼解析,無法詳細講解,感興趣的讀者可按照上述思路自行解析。
推薦閱讀
- 從零開始構建企業級RAG系統
- Spring Cloud Alibaba核心技術與實戰案例
- MySQL 8從入門到精通(視頻教學版)
- PHP 從入門到項目實踐(超值版)
- Java Web基礎與實例教程(第2版·微課版)
- Mastering Natural Language Processing with Python
- 云原生Spring實戰
- 用Flutter極速構建原生應用
- EPLAN實戰設計
- Learning Python by Building Games
- ExtJS高級程序設計
- Test-Driven Development with Django
- Spring Security Essentials
- Modern C++ Programming Cookbook
- ActionScript 3.0從入門到精通(視頻實戰版)