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+) |