網站首頁 編程語言 正文
前言
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 的基本思想。
原文鏈接:https://blog.csdn.net/vitaviva/article/details/125074388
相關推薦
- 2022-07-11 EasyExcel實現追加寫入文件
- 2022-08-25 R語言實現KMeans聚類算法實例教程_R語言
- 2023-03-13 Pandas篩選某列過濾的方法_python
- 2023-01-10 Flutter?CustomPaint繪制widget使用示例_IOS
- 2022-05-20 ElasticSearch 7.X系列之:查詢分析索引磁盤使用空間_disk_usage
- 2022-08-22 C++示例詳解Prim算法與優先隊列_C 語言
- 2023-02-17 Python去除字符串前后空格的三種方法匯總_python
- 2022-05-14 聊聊python?邏輯運算及奇怪的返回值(not,and,or)問題_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支