0x1、Lifecycle簡介
本節繼續學穿Jetpack,帶來第二個元件
Lifecycle
,用于幫助開發者管理Activity、Fragment的生命周期,它可是LiveData、ViewModel等元件的基石。
日常開發中經常會遇到這些問題:
- 需要在Activity、Fragment的生命周期回調中執行特定操作,否則會引起
或程式錯誤
,比如:無限循環的屬性動畫忘記在onDestory中取消,Eventbus忘記在onDestory中unregister等。不要想着自己小心注意就好,在多人協作的場景下,特别是在多人協作的場景下;記憶體洩露
- 一種正常解法:寫個
,重寫生命周期回調方法,把操作代碼都堆到各個方法中,以此規避認為的疏忽。可以,但是也導緻了基類臃腫不堪,不好維護,而且有些基類
一堆不需要的操作;子類被迫繼承
-
,比如onCreate()裡發起一個異步回調,但因為回調比較耗時,等到回調時已經處于onStop()狀态了,回調裡的操作可能沒意義了,是以需要拿到目前所處的生命周期狀态。可能存在不符預期的生命周期情況
- 一種正常解法:
,在生命周期回調方法中去修改這個值,異步回調根據這個值執行相應操作。額外定義一個哨崗值
Lifecycle 的出現,就是幫助開發者解決上述問題:
将元件的生命周期狀态資訊隔離出來統一管理,并允許其他對象進行觀察。
0x2、Lifecycle使用
Tips:部分内容搬運自官方文檔:《使用生命周期感覺型元件處理生命周期》
① 依賴引入
// 非Androidx
implementation "android.arch.lifecycle:extensions:1.1.1"
// Androidx
implementation 'androidx.appcompat:appcompat:1.4.1'
隻需依賴一個appcompat即可,打開左側 External Libraries 可以看到和lifecycle相關的庫:
鍵入:gradlew :app:dependencies 檢視依賴樹,可以看到core、activity等子產品都依賴lifecycle了~
一般無需額外依賴配置即可使用,當然如果對庫版本有要求、或是使用特殊情況下的擴充類,可以單獨依賴,如:
// 注解處理器
annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.3.1"
// Java 8支援的 DefaultLifecycleObserver
implementation "androidx.lifecycle:lifecycle-common-java8:2.3.1"
// 實作Service的LifecycleOwner
implementation "androidx.lifecycle:lifecycle-service:2.3.1"
// ProcessLifecycleOwner給整個app程序提供一個lifecycle
implementation "androidx.lifecycle:lifecycle-process:2.3.1"
// ReactiveStreams support for LiveData
implementation "androidx.lifecycle:lifecycle-reactivestreams:2.3.1"
關于庫的版本号及其依賴的庫,可到 MVNRepository 輸入包名自行查詢:
Tips:如果單純隻想用Lifecycle,隻需引入lifecycle-runtime,不過它一般是跟LiveData、ViewModel一起使用的。
② 基本使用
- 自定義觀察者 → 觀察者實作
接口并重寫相應方法來監控元件生命周期;DefaultLifecycleObserver
- 元件添加觀察者 →
擷取Lifecycle執行個體,調用getLifecycle()
addObserve()
Tips:舊版的寫法 → 觀察者實作 LifecycleObserver,通過 OnLifecycleEvent注解 的方式添加對應生命周期的方法,但這種寫法已經廢棄了,文檔注釋中建議使用 DefaultLifecycleObserver 或者 LifecycleEventObserver。
使用代碼示例如下:
運作結果如下:
Activity中不需要重寫一堆生命周期回調方法,隻需添加一個觀察者,從
繼承
變成了
組合
,代碼精簡效果不是一星半點。
你可能不知道這有多妙,容傑哥娓娓道來,想想:
現在有十個庫,都要在生命周期裡執行相關操作,按照原先的寫法,得重寫Activity生命周期回調,補上這是個庫對應的代碼調用,恭喜,這個類一下子就變得 又長又臭 了。
再加下難度?
庫對應的生命周期回調都不一緻,比如:A庫隻關注onCreate()和onDestory(),B庫隻關注onDestory(),C庫隻關注onStop等。當要去掉、增加、修改某一個庫時,你可得 打醒十二分精神,畢竟一個不小心改錯了,就得在這種低級BUG上耗費寶貴的時間。
那換成Lifecycle這種方案呢?它幫我們做到了:
關注點分離
每個庫定義一個觀察者,在其中按需重寫生命周期回調,Activity無腦addObserve()即可。将原本又臭又長的代碼 隔離 到單獨類中。改的話直接改對應類,無需擔心影響到其他庫,增删改庫無壓力,妙啊!
③ Event(事件) & State(狀态)
官方文檔中有這樣一個圖:
有些讀者看了可能有點懵逼,把中間的Event大寫改成小寫你就懂了,比如ON_CREATE → onCreate(),就是 生命周期回調,而State就是所處的 生命周期狀态,有時我們需要擷取生命周期元件目前的狀态,就是通過這個判定的,兩者配合使用。
解讀:
- Lifecycle.State.CREATED → 回調onCreate()、onStop()後;
- Lifecycle.State.STARTED → 回調onStart()、onPause()後;
- Lifecycle.State.RESUMED → 回調onResume()後;
- Lifecycle.State.DESTROYED → 回調onDestroy()後;
Tips:判斷生命周期狀态示例:if (lifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
④ 自定義 LifecycleOwner
appcompat 26.1.0 及更高版本的 Fragment、Activity 預設實作了 LifecycleOwner,一般是無需自定義的,當然想自己實作一個具有生命周期感覺的元件,也開始可以的。先知道下三個核心類:
-
→ 具有Lifecycle;LifecycleOwner
-
→ 監聽生命周期事件;LifecycleObserver
-
→ 轉發生命周期事件,自定義LifecycleOwner才用得到;LifecycleRegistry
為了應付寫例子沒啥大用,直接以 Lifecycle可選庫
lifecycle-process
為例講解一波~
它為整個App程序提供一個 ProcessLifecycleOwner,通過簡單幾行代碼,即可監聽App前背景切換。
依賴引入:
implementation "androidx.lifecycle:lifecycle-process:2.4.0"
測試代碼如下,顯示Application類:
然後是調用的Activity:
運作下看下效果:
簡單易用沒毛病,輕松監聽應用前背景切換,接着扒下這個庫是如何實作的:
可很簡單,就四個檔案,先是初始化類
ProcessLifecycleInitializer
:
利用ContentProvider拿到App的Context,執行初始化操作,這裡用到另一個元件StartUp,後續會介紹~
跟下
LifecycleDispatcher → init()
registerActivityLifecycleCallbacks()
是Application提供的一個方法,可以監控App内所有Activity的生命周期。隻重寫了
onActivityCreated()
,通過
ReportFragment
來Hook宿主的生命周期。
接着往下看
ProcessLifecycleOwner → init() → attach()
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-dbtMSXer-1653642216077)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c2eeb1a999b14941b50c22ec5f118ebf~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image)]
看不太懂,貌似是為了保證onStart()和onResume()的順序相對正确,跟下回調方法:
再跟下
mDelayedPauseRunnable
:
延時700ms,然後去驗證是否處于背景,然後 LifecycleRegistry 轉發生命周期事件,完。簡單點就是封裝了 Application.ActivityLifecycleCallbacks,并提供了一個全局的 LifecycleOwner。
文末
我總結了一些Android核心知識點,以及一些最新的大廠面試題、知識腦圖和視訊資料解析。
需要的小夥伴私信【學習】我免費分享給你,以後的路也希望我們能一起走下去。(謝謝大家一直以來的支援,需要的自己領取)
直接點選文末小卡片可以領取哦!
Android學習PDF+架構視訊+面試文檔+源碼筆記
部分資料一覽:
- 330頁PDF Android學習核心筆記(内含8大闆塊)
- Android學習的系統對應視訊
- Android進階的系統對應學習資料
- Android BAT大廠面試題(有解析)
領取位址:
點選下方卡片免費領取