不再用手写 onSaveInstanceState,因为你的时间非常值钱
2023-12-24 01:34:50
使用 ViewModel 和 SavedStateHandle 简化 Android Activity 状态管理
作为一名经验丰富的 Android 开发者,你可能已经手写过许多 onSaveInstanceState
和 onRestoreInstanceState
方法,以在 Activity 变为不可见时保留其状态。然而,这些方法不仅繁琐,还容易出错。幸运的是,Android Jetpack 提供了一种更简单、更可靠的方法来管理 Activity 状态,那就是使用 ViewModel
和 SavedStateHandle
。
什么是 ViewModel?
ViewModel
是一个与 Activity 生命周期无关的类,它可以存储数据并使其在 Activity 重新创建后仍然可用。换句话说,ViewModel
的生命周期与 Activity 无关,它只会随着应用程序的销毁而销毁。
什么是 SavedStateHandle?
SavedStateHandle
是一个与 Activity 生命周期相关的类,它可以保存临时数据。与 ViewModel
不同的是,SavedStateHandle
的生命周期与 Activity 相同,这意味着它将在 Activity 重新创建后被销毁。
使用 ViewModel 和 SavedStateHandle 的好处
使用 ViewModel
和 SavedStateHandle
管理 Activity 状态具有以下好处:
- 简化了代码:
ViewModel
和SavedStateHandle
提供了一种更简单的方法来管理 Activity 的状态,使你可以专注于编写业务逻辑,而不用担心手写onSaveInstanceState
和onRestoreInstanceState
方法。 - 减少出错的可能性:
ViewModel
和SavedStateHandle
可以自动处理数据类型和键值的对应关系,从而减少出错的可能性。 - 提高代码的可读性:
ViewModel
和SavedStateHandle
使得代码更加易于阅读和理解。
如何使用 ViewModel 和 SavedStateHandle
要使用 ViewModel
和 SavedStateHandle
管理 Activity 状态,请按照以下步骤操作:
- 创建一个 ViewModel 对象: 在 Activity 中,使用
by viewModels()
创建一个ViewModel
对象,如下所示:
private val viewModel: MyViewModel by viewModels()
- 在 onSaveInstanceState 中保存数据: 在
onSaveInstanceState
方法中,使用SavedStateHandle
保存数据,如下所示:
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
viewModel.savedStateHandle.set("myKey", myValue)
}
- 在 onRestoreInstanceState 中恢复数据: 在
onRestoreInstanceState
方法中,使用SavedStateHandle
恢复数据,如下所示:
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
viewModel.savedStateHandle.getLiveData("myKey").observe(this) { myValue ->
// Do something with the restored value
}
}
示例
以下是一个使用 ViewModel
和 SavedStateHandle
管理 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 比手动管理状态更好?
手动管理状态非常繁琐且容易出错。ViewModel
和 SavedStateHandle
提供了一种更简单、更可靠的方法来管理状态,并减少出错的可能性。
2. 我可以在 Activity 中使用多个 ViewModel 吗?
是的,你可以在 Activity 中使用多个 ViewModel
。每个 ViewModel
都负责管理特定部分的状态。
3. 什么时候应该使用 SavedStateHandle?
SavedStateHandle
应该用于保存临时数据,这些数据需要在 Activity 重新创建后仍然可用。
4. 如何处理配置更改?
ViewModel
和 SavedStateHandle
可以自动处理配置更改。在配置更改后,ViewModel
的数据仍然可用,并且 SavedStateHandle
中保存的数据也会被恢复。
5. 我可以在 Fragment 中使用 ViewModel 吗?
是的,你可以在 Fragment 中使用 ViewModel
。ViewModel
与 Activity 无关,因此可以由 Fragment 以及 Activity 使用。
结论
ViewModel
和 SavedStateHandle
是管理 Android Activity 状态的强大工具。它们简化了代码,减少了出错的可能性,并提高了代码的可读性。如果你还没有使用它们,强烈建议你开始使用它们,以编写更简洁、更可靠、更易于维护的代码。