返回

ViewModelSavedState:在意外销毁后恢复 ViewModel 数据

Android

使用 ViewModelSavedState 确保 Android 应用程序中的数据持久性

简化数据管理,提高应用程序鲁棒性

在 Android 应用程序开发中,管理活动的生命周期和维护数据至关重要。ViewModel 是一个强大工具,可以帮助解耦数据和活动的生命周期,防止数据在屏幕旋转等配置变更期间丢失。然而,当活动意外销毁时,ViewModel 的数据也会丢失,例如由于系统内存不足或用户强制关闭应用程序。

ViewModelSavedState:拯救意外销毁的数据

ViewModelSavedState 是一个更现代、更可靠的解决方案,用于在意外销毁后恢复 ViewModel 数据。它提供了以下优点:

  • 简洁性: 无需使用 onSaveInstanceState 和 onRestoreInstanceState 等生命周期方法,简化了代码。
  • 可靠性: 即使在意外销毁的情况下,也能保证数据恢复。
  • 可预测性: 为数据持久化提供了明确的行为和规则。

ViewModelSavedState 的工作原理

ViewModelSavedState 使用系统提供的 Bundle 来保存和恢复 ViewModel 数据。当 ViewModel 创建时,它可以访问一个名为 savedStateBundle 对象。这个 Bundle 对象用于存储和检索需要在意外销毁后恢复的数据。

在意外销毁发生时,ViewModelSavedState 会自动将 savedState 序列化到磁盘。当应用程序重新创建时,ViewModel 会从磁盘中恢复 savedState 并将其恢复到其原始状态。

使用 ViewModelSavedState 的步骤

使用 ViewModelSavedState 非常简单。以下步骤概述了如何实现:

  1. 在 ViewModel 中,创建一个空的 savedStateHandle 实例:
private val savedStateHandle = SavedStateHandle()
  1. 使用 savedStateHandle 存储和检索数据:
savedStateHandle["myData"] = myData
val myData = savedStateHandle["myData"]
  1. 在活动或片段中,从 ViewModel 获取 savedStateHandle
val viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
val savedStateHandle = viewModel.savedStateHandle

代码示例

为了展示 ViewModelSavedState 的用法,让我们考虑一个简单的计数器应用程序。这个应用程序有一个按钮来增加计数器,并且我们希望在意外销毁后保留计数器的值。

MyViewModel.kt

class MyViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
    private var count = 0

    init {
        savedStateHandle["count"] = count
    }

    fun increaseCount() {
        count++
        savedStateHandle["count"] = count
    }

    fun getCount(): Int {
        return savedStateHandle["count"] ?: 0
    }
}

MyActivity.kt

class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val button = findViewById<Button>(R.id.button)
        button.setOnClickListener { viewModel.increaseCount() }
    }
}

结论

ViewModelSavedState 为在意外销毁后恢复 ViewModel 数据提供了一种简单而可靠的方法。它消除了使用 onSaveInstanceState 的需要,并简化了持久化数据的过程。通过利用 ViewModelSavedState,开发人员可以创建具有鲁棒性且用户体验更佳的 Android 应用程序。

常见问题解答

  1. ViewModelSavedState 与 onSaveInstanceState 有什么区别?
    ViewModelSavedState 是一个更现代、更可靠的解决方案,消除了使用 onSaveInstanceState 的需要。它提供了一致且可预测的行为,确保即使在意外销毁后也能恢复数据。

  2. ViewModelSavedState 是否适用于所有类型的 ViewModel 数据?
    是的,ViewModelSavedState 可以用于任何类型的 ViewModel 数据,包括原始类型、列表和对象。

  3. ViewModelSavedState 会在应用程序每次启动时都保存数据吗?
    不,ViewModelSavedState 只会在意外销毁发生时才保存数据。

  4. ViewModelSavedState 是否会影响应用程序的性能?
    ViewModelSavedState 的性能开销很小,可以忽略不计。

  5. ViewModelSavedState 是否适用于所有 Android 版本?
    ViewModelSavedState 适用于 Android Jetpack 中支持的 Android 版本。