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