返回

不再用手写 onSaveInstanceState,因为你的时间非常值钱

Android

使用 ViewModel 和 SavedStateHandle 简化 Android Activity 状态管理

作为一名经验丰富的 Android 开发者,你可能已经手写过许多 onSaveInstanceStateonRestoreInstanceState 方法,以在 Activity 变为不可见时保留其状态。然而,这些方法不仅繁琐,还容易出错。幸运的是,Android Jetpack 提供了一种更简单、更可靠的方法来管理 Activity 状态,那就是使用 ViewModelSavedStateHandle

什么是 ViewModel?

ViewModel 是一个与 Activity 生命周期无关的类,它可以存储数据并使其在 Activity 重新创建后仍然可用。换句话说,ViewModel 的生命周期与 Activity 无关,它只会随着应用程序的销毁而销毁。

什么是 SavedStateHandle?

SavedStateHandle 是一个与 Activity 生命周期相关的类,它可以保存临时数据。与 ViewModel 不同的是,SavedStateHandle 的生命周期与 Activity 相同,这意味着它将在 Activity 重新创建后被销毁。

使用 ViewModel 和 SavedStateHandle 的好处

使用 ViewModelSavedStateHandle 管理 Activity 状态具有以下好处:

  • 简化了代码: ViewModelSavedStateHandle 提供了一种更简单的方法来管理 Activity 的状态,使你可以专注于编写业务逻辑,而不用担心手写 onSaveInstanceStateonRestoreInstanceState 方法。
  • 减少出错的可能性: ViewModelSavedStateHandle 可以自动处理数据类型和键值的对应关系,从而减少出错的可能性。
  • 提高代码的可读性: ViewModelSavedStateHandle 使得代码更加易于阅读和理解。

如何使用 ViewModel 和 SavedStateHandle

要使用 ViewModelSavedStateHandle 管理 Activity 状态,请按照以下步骤操作:

  1. 创建一个 ViewModel 对象: 在 Activity 中,使用 by viewModels() 创建一个 ViewModel 对象,如下所示:
private val viewModel: MyViewModel by viewModels()
  1. 在 onSaveInstanceState 中保存数据:onSaveInstanceState 方法中,使用 SavedStateHandle 保存数据,如下所示:
override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    viewModel.savedStateHandle.set("myKey", myValue)
}
  1. 在 onRestoreInstanceState 中恢复数据:onRestoreInstanceState 方法中,使用 SavedStateHandle 恢复数据,如下所示:
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    viewModel.savedStateHandle.getLiveData("myKey").observe(this) { myValue ->
        // Do something with the restored value
    }
}

示例

以下是一个使用 ViewModelSavedStateHandle 管理 Activity 状态的示例:

class MainActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels()

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

        viewModel.savedStateHandle.getLiveData("myKey").observe(this) { myValue ->
            // Do something with the restored value
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        viewModel.savedStateHandle.set("myKey", myValue)
    }
}

常见问题解答

1. 为什么使用 ViewModel 和 SavedStateHandle 比手动管理状态更好?

手动管理状态非常繁琐且容易出错。ViewModelSavedStateHandle 提供了一种更简单、更可靠的方法来管理状态,并减少出错的可能性。

2. 我可以在 Activity 中使用多个 ViewModel 吗?

是的,你可以在 Activity 中使用多个 ViewModel。每个 ViewModel 都负责管理特定部分的状态。

3. 什么时候应该使用 SavedStateHandle?

SavedStateHandle 应该用于保存临时数据,这些数据需要在 Activity 重新创建后仍然可用。

4. 如何处理配置更改?

ViewModelSavedStateHandle 可以自动处理配置更改。在配置更改后,ViewModel 的数据仍然可用,并且 SavedStateHandle 中保存的数据也会被恢复。

5. 我可以在 Fragment 中使用 ViewModel 吗?

是的,你可以在 Fragment 中使用 ViewModelViewModel 与 Activity 无关,因此可以由 Fragment 以及 Activity 使用。

结论

ViewModelSavedStateHandle 是管理 Android Activity 状态的强大工具。它们简化了代码,减少了出错的可能性,并提高了代码的可读性。如果你还没有使用它们,强烈建议你开始使用它们,以编写更简洁、更可靠、更易于维护的代码。