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 可观察对象中的值。

可接受的类

类型/类数组支持
doubledouble[]
intint []
longlong []
StringString[]
bytebyte[]
charchar[]
CharSequenceCharSequence[]
floatfloat[]
ParcelableParcelable[]
SerializableSerializable[]
shortshort[]
SparseArray
Binder
Bundle
ArrayList
Size (only in API 21+)
SizeF (only in API 21+)

其他资源

Codelab

Android 生命周期感知型组件 Codelab

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值