Android12四大組件之Activity生命周期變化詳解
前言
Android12 有很多令人驚喜的變化,比如基於 Material You 的全新 UI,基於 SplashScreen 的應用啟動畫面以及更安全的隱私設置等等,此外也有一些需要開發者註意的行為變化,比如這裡介紹的 Activity 的 Lifecycle 上的變化
點擊返回鍵Activity不在onDestroy
Android 12 以前,當我們處於 Root Activity 時,點擊返回鍵時,應用返回桌面, Activity 執行 onDestroy,程序結束。 Android 12 起同樣場景下 Activity 隻會 onStop,不再執行 onDestroy。
通過下面代碼進行驗證:
class LifecycleLogObserver : LifecycleEventObserver { override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { Log.d(source::class.java.simpleName, event.name) } } class SampleActivity: AppCompatActivity() { init { lifecycle.addObserver(LifecycleLogObserver()) } }
啟動 Activity,按下返回鍵後,重新打開 App。首先 Android12 之前的設備,Log 如下:
// 初次啟動
D/SampleActivity: ON_CREATE
D/SampleActivity: ON_START
D/SampleActivity: ON_RESUME
// 返回桌面
D/SampleActivity: ON_PAUSE
D/SampleActivity: ON_STOP
D/SampleActivity: ON_DESTROY
// 再次啟動
D/SampleActivity: ON_CREATE
D/SampleActivity: ON_START
D/SampleActivity: ON_RESUME
再開 Android12 之後的設備:
// 初次啟動
D/SampleActivity: ON_CREATE
D/SampleActivity: ON_START
D/SampleActivity: ON_RESUME
// 返回桌面
D/SampleActivity: ON_PAUSE
D/SampleActivity: ON_STOP
// 再次啟動
D/SampleActivity: ON_START
D/SampleActivity: ON_RESUME
我們知道 ViewModel 的銷毀在 onDestroy 中,這樣改動後 ViewModel 中的狀態可以保存,再次啟動後可以直接使用。對於使用者來說直接感受就是冷啟動變為瞭熱啟動,啟動速度更快。
註意:所謂 Root Activity 就是我們在 AndroidManifest 中配置瞭 IntentFilter 為 ACTION_MAIN 和 CATEGORY_LAUNCHER 的入口 Activity,其他 Activity 點擊返回鍵後行為不變,依然會 onDestroy
重新onBackPressed時的註意點
如果你的應用在 Android12 中沒有上述變化,那很有可能是你重寫瞭 onBackPressed 並手動調用瞭 finish(),為瞭在行為上符合 Android12 的預期,需要修改如下:
class SampleActivity : AppCompatActivity() { private var flag = true override fun onBackPressed() { if (flag) { flag = false TODO("do sth business") return } //Don't call finish() super.onBackPressed() } }
當然,官方已不再推薦重寫 onBackPressed 瞭,更好的做法使用 AndroidX 的 OnBackPressedCallback 重寫你的實現,它會自動適配 Android12 的變化。
class SampleActivity : AppCompatActivity() { private val onBackPressedCallback: OnBackPressedCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { TODO("do sth business") //處理自定義業務後,後續返回鍵交回系統處理 onBackPressedCallback.isEnabled = false } } }
總結
隨著手機內存的增大,相比起資源的及時釋放,用戶體驗變得更加重要,這也會為什麼 Android12 會引入這次的變化。這次變化也讓 onStop 的重要性得以提升,我們要更加區分 onStop 與 onDestroy 在使用場景上的不同:onDestroy 負責必要的資源釋放,而其餘類似活躍狀態的切換應該放在 onStart/onStop 中進行,這符合 androidx-lifecycle 的基本思想。
到此這篇關於Android12四大組件之Activity生命周期變化詳解的文章就介紹到這瞭,更多相關Android Activity生命周期內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Android onbackpressed實現返回鍵的攔截和彈窗流程分析
- Android內存泄漏的原因及解決技巧
- Android開發Jetpack組件Lifecycle使用篇
- Android入門教程之組件Activity的生命周期詳解
- Android Activity生命周期調用的理解