![](/img/trans.png)
[英]Issue with use of onSaveInstanceState and onRestoreInstanceState
[英]Use-case of Android Lifecycle functions onRestoreInstanceState, onSaveInstanceState
我最近寫了一個演示應用程序,它只需要暫時顯示一些數據——我的意思是一旦應用程序被用戶正確銷毀,數據就會消失。 為此,我閱讀了頁面The Activity Lifecycle ,它似乎建議覆蓋 Activity 方法onRestoreInstanceState()
和onSaveInstanceState()
。
效果很好,數據是通過屏幕旋轉保存的。 並將應用程序發送到后台。
但隨后我會讓應用程序運行並走開,當我再次查看它時,數據已經消失了。
我花了幾個小時試圖調試我的應用程序,並重新閱讀該頁面。
最后,我閱讀了保存 UI 狀態。 它將覆蓋這些方法稱為“ViewModel”方法,並明確指出以這種方式保存的數據不會在系統啟動的進程死亡中幸存——這解釋了我的觀察。
我的主要問題是:這種“ViewModel”持久化方法的實際應用到底是什么? 當用戶不查看時隨機處理數據的持久性機制的用例是什么?
(我猜這是應用程序不在后台運行時遺留下來的舊 API。但我沒有在文檔中看到這一點。)
第二個問題是,閱讀第一頁,我到底應該如何理解這種不幸的行為? 我錯過了什么? (它很長。)
這種“ViewModel”持久化方法的實際應用到底是什么?
這不是一種持久性方法。 ViewModel
是一種跨配置更改保持 state 的方式。 將SavedStateHandle
與ViewModel
一起使用(映射到onSaveInstanceState()
和onRestoreInstanceState()
對於相當狹窄的用例也很有用:
此時,Android 想要假裝您的應用程序一直存在,盡管您的進程已被終止。 因此,Android 不僅會為您啟動一個新進程,而且還會重新創建用戶進行的最后一個活動……並且您將保存已保存的實例 state 作為其中的一部分。
但是,這不是一種持久性方法。 對於您希望長期保存的數據,您需要將其保存到磁盤(SQLite、 SharedPreferences
、JSON 文件等)或某個服務器。 值得注意的是,如果用戶長時間離開您的應用程序(超過約 30 分鍾),Android 將不會嘗試恢復實例 state,您的應用程序將正常啟動。
當系統在后台終止您的應用程序時,您需要使用SavedStateHandle
和ViewModel
來獲得數據持久性。 否則,它更多的是在組件之間共享數據,以及在Activity
破壞中幸存下來,例如在屏幕旋轉時,無需進行大量樣板處理。
就像onSaveInstanceState
一樣,這純粹是關於當系統殺死您正在運行的應用程序以恢復 memory 時持久化數據,這樣當用戶再次切換到“正在運行”的應用程序時,它可以重新創建並恢復原樣。 當應用程序被故意停止時,它不會保存任何數據,例如調用finish()
,用戶退出或將其滑走等。
這些東西應該總是可以正常工作 - 如果您看到您的數據“丟失”並且應用程序沒有在后台崩潰,那么您的保存/恢復邏輯可能無法正常工作。 一個很好的測試方法是在您的設備上的Developer Options中進行測試(如果您不知道如何進行搜索,這取決於您的設備)並啟用Don't keep Activities 。 一旦他們 go 到后台,這將摧毀他們,它應該幫助你測試它是如何處理的。 您可以處理旋轉的事實表明這是一個背景崩潰,但這取決於您如何處理配置更改
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.