12 - ViewModel的已保存狀態模塊

ViewModel的已保存狀態模塊

ViewModel 對象可以處理配置更改,因此您無需擔心旋轉時或其他情況下的狀態。但是,如果您需要處理系統發起的進程終止,則可以使用 onSaveInstanceState() 作爲備用方式。

界面狀態通常在 ViewModel 對象中(而不是 Activity 中)存儲或引用;因此,使用 onSaveInstanceState() 時需要該模塊可以爲您處理的某個樣板。

模塊設置好以後,ViewModel 對象會通過其構造函數接收 SavedStateHandle 對象。這是一個鍵值對映射,用於向已保存狀態寫入對象以及從其中檢索對象。這些值會在進程被系統終止後繼續保留,並通過同一對象保持可用狀態。

注意:狀態必須是簡單的輕量級狀態。對於複雜或大型數據,您應該使用本地持久性存儲

設置和使用

聲明

        // Saved state module for ViewModel
        implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"

設置 ViewModel 來接收 SavedStateHandle,您需要使用可擴展 AbstractSavedStateVMFactory 的 Factory 來創建它們。

    val vm = ViewModelProvider(this, SavedStateVMFactory(this))
            .get(SavedStateViewModel::class.java)    

之後,ViewModel 便可以有一個接收 SavedStateHandle 的構造函數:

    class SavedStateViewModel(private val state: SavedStateHandle) : ViewModel() { ... }    

存儲和檢索值

SavedStateHandle 類包含鍵值對映射應有的方法:

  • get(String key)
  • contains(String key)
  • remove(String key)
  • set(String key, T value)
  • keys()

此外,還有一種特殊的方法:getLiveData(String key),用於返回封裝在 LiveData 可觀察對象中的值。

可接受的類

類型/類 數組支持
double double[]
int int []
long long []
String String[]
byte byte[]
char char[]
CharSequence CharSequence[]
float float[]
Parcelable Parcelable[]
Serializable Serializable[]
short short[]
SparseArray
Binder
Bundle
ArrayList
Size (only in API 21+)
SizeF (only in API 21+)

其他資源

Codelab

Android 生命週期感知型組件 Codelab

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章