天天看點

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

0x1、Lifecycle簡介

【Jetpack】學穿: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相關的庫:

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

鍵入:gradlew :app:dependencies 檢視依賴樹,可以看到core、activity等子產品都依賴lifecycle了~

【Jetpack】學穿: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 輸入包名自行查詢:

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)
Tips:如果單純隻想用Lifecycle,隻需引入lifecycle-runtime,不過它一般是跟LiveData、ViewModel一起使用的。

② 基本使用

  • 自定義觀察者 → 觀察者實作

    DefaultLifecycleObserver

    接口并重寫相應方法來監控元件生命周期;
  • 元件添加觀察者 →

    getLifecycle()

    擷取Lifecycle執行個體,調用

    addObserve()

Tips:舊版的寫法 → 觀察者實作 LifecycleObserver,通過 OnLifecycleEvent注解 的方式添加對應生命周期的方法,但這種寫法已經廢棄了,文檔注釋中建議使用 DefaultLifecycleObserver 或者 LifecycleEventObserver。

使用代碼示例如下:

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

運作結果如下:

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

Activity中不需要重寫一堆生命周期回調方法,隻需添加一個觀察者,從

繼承

變成了

組合

,代碼精簡效果不是一星半點。

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

你可能不知道這有多妙,容傑哥娓娓道來,想想:

現在有十個庫,都要在生命周期裡執行相關操作,按照原先的寫法,得重寫Activity生命周期回調,補上這是個庫對應的代碼調用,恭喜,這個類一下子就變得 又長又臭 了。

再加下難度?

庫對應的生命周期回調都不一緻,比如:A庫隻關注onCreate()和onDestory(),B庫隻關注onDestory(),C庫隻關注onStop等。當要去掉、增加、修改某一個庫時,你可得 打醒十二分精神,畢竟一個不小心改錯了,就得在這種低級BUG上耗費寶貴的時間。

那換成Lifecycle這種方案呢?它幫我們做到了:

關注點分離

每個庫定義一個觀察者,在其中按需重寫生命周期回調,Activity無腦addObserve()即可。将原本又臭又長的代碼 隔離 到單獨類中。改的話直接改對應類,無需擔心影響到其他庫,增删改庫無壓力,妙啊!

③ Event(事件) & State(狀态)

官方文檔中有這樣一個圖:

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

有些讀者看了可能有點懵逼,把中間的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,一般是無需自定義的,當然想自己實作一個具有生命周期感覺的元件,也開始可以的。先知道下三個核心類:

  • LifecycleOwner

    → 具有Lifecycle;
  • LifecycleObserver

    → 監聽生命周期事件;
  • LifecycleRegistry

    → 轉發生命周期事件,自定義LifecycleOwner才用得到;

為了應付寫例子沒啥大用,直接以 Lifecycle可選庫

lifecycle-process

為例講解一波~

它為整個App程序提供一個 ProcessLifecycleOwner,通過簡單幾行代碼,即可監聽App前背景切換。

依賴引入:

implementation "androidx.lifecycle:lifecycle-process:2.4.0" 
           

測試代碼如下,顯示Application類:

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

然後是調用的Activity:

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

運作下看下效果:

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

簡單易用沒毛病,輕松監聽應用前背景切換,接着扒下這個庫是如何實作的:

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

可很簡單,就四個檔案,先是初始化類

ProcessLifecycleInitializer

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

利用ContentProvider拿到App的Context,執行初始化操作,這裡用到另一個元件StartUp,後續會介紹~

跟下

LifecycleDispatcher → init()

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

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()的順序相對正确,跟下回調方法:

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

再跟下

mDelayedPauseRunnable

【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

延時700ms,然後去驗證是否處于背景,然後 LifecycleRegistry 轉發生命周期事件,完。簡單點就是封裝了 Application.ActivityLifecycleCallbacks,并提供了一個全局的 LifecycleOwner。

文末

我總結了一些Android核心知識點,以及一些最新的大廠面試題、知識腦圖和視訊資料解析。

需要的小夥伴私信【學習】我免費分享給你,以後的路也希望我們能一起走下去。(謝謝大家一直以來的支援,需要的自己領取)

直接點選文末小卡片可以領取哦!

Android學習PDF+架構視訊+面試文檔+源碼筆記

部分資料一覽:

  • 330頁PDF Android學習核心筆記(内含8大闆塊)
【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)
【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)
  • Android學習的系統對應視訊
【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)
  • Android進階的系統對應學習資料
【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)
  • Android BAT大廠面試題(有解析)
【Jetpack】學穿:Lifecycle → 生命周期 (使用篇)

領取位址:

點選下方卡片免費領取

繼續閱讀