📌  相关文章
📜  Android 中带有 SavedState 的 ViewModel(1)

📅  最后修改于: 2023-12-03 14:59:15.967000             🧑  作者: Mango

Android 中带有 SavedState 的 ViewModel

在 Android 应用程序中,ViewModel 通常用于保存应用程序的状态,并且可以通过 ViewModel Survive 配合 Bundle 或 SavedStateRegistry 来保存/恢复此状态。

在 ViewModel Survive 中,使用 Bundle 来保存 ViewModel 的状态,但是当操作系统杀死应用程序时(例如:内存不足),此状态将无法保存。而 SavedStateRegistry 使用 ProcessLifecycleOwner 来注册并使用 SavedStateHandle 来保存和恢复 ViewModel 的状态,并在进程被杀死时自动调用 onSaveInstanceState() 来保存状态。

因此,在 Android 中使用带有 SavedState 的 ViewModel 更为安全和可靠,也更容易与应用程序的生命周期进行协调。以下是如何使用带有 SavedState 的 ViewModel 的示例。

1. 添加依赖项
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
2. 创建 ViewModel
class MyViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
    companion object {
        private const val KEY_VALUE = "key_value"
    }

    fun saveValue(value: String) {
        savedStateHandle.set(KEY_VALUE, value)
    }

    fun getValue(): String? {
        return savedStateHandle.get<String>(KEY_VALUE)
    }
}

在上面的示例中,我们创建了一个带有 SavedState 的 ViewModel,并使用 SavedStateHandle 来保存和恢复 ViewModel 的状态。

3. 将 ViewModel 添加到 Activity/Fragment
class MyActivity : AppCompatActivity() {
    private val viewModel: MyViewModel by viewModels()

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

        val value = viewModel.getValue()
        textView.text = value ?: "No value found"
    }
}

在上面的示例中,我们使用 viewModels() 方法来获取 MyViewModel 的实例,并在 onCreate() 方法中使用此 ViewModel。请注意,当操作系统杀死应用程序并重启时,ViewModel 的状态将自动恢复。

总结

在 Android 应用程序中使用带有 SavedState 的 ViewModel 可以更安全、可靠,并且更容易与应用程序的生命周期进行协调。因此,我们建议您在应用程序中使用带有 SavedState 的 ViewModel。