Android12四大組件之Activity生命周期變化詳解
前言
Android12 有很多令人驚喜的變化,比如基于 Material You 的全新 UI,基于 SplashScreen 的應(yīng)用啟動(dòng)畫面以及更安全的隱私設(shè)置等等,此外也有一些需要開發(fā)者注意的行為變化,比如這里介紹的 Activity 的 Lifecycle 上的變化
點(diǎn)擊返回鍵Activity不在onDestroy
Android 12 以前,當(dāng)我們處于 Root Activity 時(shí),點(diǎn)擊返回鍵時(shí),應(yīng)用返回桌面, Activity 執(zhí)行 onDestroy,程序結(jié)束。 Android 12 起同樣場(chǎng)景下 Activity 只會(huì) onStop,不再執(zhí)行 onDestroy。
通過(guò)下面代碼進(jìn)行驗(yàn)證:
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()) } }
啟動(dòng) Activity,按下返回鍵后,重新打開 App。首先 Android12 之前的設(shè)備,Log 如下:
// 初次啟動(dòng)
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òng)
D/SampleActivity: ON_CREATE
D/SampleActivity: ON_START
D/SampleActivity: ON_RESUME
再開 Android12 之后的設(shè)備:
// 初次啟動(dòng)
D/SampleActivity: ON_CREATE
D/SampleActivity: ON_START
D/SampleActivity: ON_RESUME
// 返回桌面
D/SampleActivity: ON_PAUSE
D/SampleActivity: ON_STOP
// 再次啟動(dòng)
D/SampleActivity: ON_START
D/SampleActivity: ON_RESUME
我們知道 ViewModel 的銷毀在 onDestroy 中,這樣改動(dòng)后 ViewModel 中的狀態(tài)可以保存,再次啟動(dòng)后可以直接使用。對(duì)于使用者來(lái)說(shuō)直接感受就是冷啟動(dòng)變?yōu)榱藷釂?dòng),啟動(dòng)速度更快。
注意:所謂 Root Activity 就是我們?cè)?AndroidManifest 中配置了 IntentFilter 為 ACTION_MAIN 和 CATEGORY_LAUNCHER 的入口 Activity,其他 Activity 點(diǎn)擊返回鍵后行為不變,依然會(huì) onDestroy
重新onBackPressed時(shí)的注意點(diǎn)
如果你的應(yīng)用在 Android12 中沒(méi)有上述變化,那很有可能是你重寫了 onBackPressed 并手動(dòng)調(diào)用了 finish(),為了在行為上符合 Android12 的預(yù)期,需要修改如下:
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() } }
當(dāng)然,官方已不再推薦重寫 onBackPressed 了,更好的做法使用 AndroidX 的 OnBackPressedCallback 重寫你的實(shí)現(xiàn),它會(huì)自動(dòng)適配 Android12 的變化。
class SampleActivity : AppCompatActivity() { private val onBackPressedCallback: OnBackPressedCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { TODO("do sth business") //處理自定義業(yè)務(wù)后,后續(xù)返回鍵交回系統(tǒng)處理 onBackPressedCallback.isEnabled = false } } }
總結(jié)
隨著手機(jī)內(nèi)存的增大,相比起資源的及時(shí)釋放,用戶體驗(yàn)變得更加重要,這也會(huì)為什么 Android12 會(huì)引入這次的變化。這次變化也讓 onStop 的重要性得以提升,我們要更加區(qū)分 onStop 與 onDestroy 在使用場(chǎng)景上的不同:onDestroy 負(fù)責(zé)必要的資源釋放,而其余類似活躍狀態(tài)的切換應(yīng)該放在 onStart/onStop 中進(jìn)行,這符合 androidx-lifecycle 的基本思想。
到此這篇關(guān)于Android12四大組件之Activity生命周期變化詳解的文章就介紹到這了,更多相關(guān)Android Activity生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android11及以上文件讀寫權(quán)限申請(qǐng)?jiān)敿?xì)介紹
安卓11改變了此前安卓系統(tǒng)對(duì)于文件管理的規(guī)則,在安卓 11 上,文件讀寫變成了特殊權(quán)限,下面這篇文章主要給大家介紹了關(guān)于Android11及以上文件讀寫權(quán)限申請(qǐng)的相關(guān)資料,需要的朋友可以參考下2022-08-08Android使用TextView實(shí)現(xiàn)無(wú)下劃線超鏈接的方法
這篇文章主要介紹了Android使用TextView實(shí)現(xiàn)無(wú)下劃線超鏈接的方法,結(jié)合實(shí)例形式分析了Android中TextView超鏈接去除下劃線的相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2016-08-08Android中判斷l(xiāng)istview是否滑動(dòng)到頂部和底部的實(shí)現(xiàn)方法
下面小編就為大家分享一篇Android中判斷l(xiāng)istview是否滑動(dòng)到頂部和底部的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11詳解Android數(shù)據(jù)存儲(chǔ)之SQLCipher數(shù)據(jù)庫(kù)加密
對(duì)于已經(jīng)ROOT的手機(jī)來(lái)說(shuō)的沒(méi)有任何安全性可以,一旦被利用將會(huì)導(dǎo)致數(shù)據(jù)庫(kù)數(shù)據(jù)的泄漏,本篇文章主要介紹了Android數(shù)據(jù)存儲(chǔ)之SQLCipher數(shù)據(jù)庫(kù)加密,具有一定的參考價(jià)值,有需要的可以了解一下。2016-12-12Android(2.2/2.3系統(tǒng))Gallery解決默認(rèn)和橫豎屏切換選中狀態(tài)問(wèn)題
本文主要介紹Android Gallery,在Android開發(fā)過(guò)程中肯定會(huì)遇到版本不同,在開發(fā)過(guò)程中需要調(diào)整的,這里針對(duì)Android(2.2/2.3系統(tǒng)版本) Gallery解決默認(rèn)和橫豎屏切換選中狀態(tài)問(wèn)題2016-07-07