当其主机 Activity 不在 Activity 堆栈的顶部并且设备旋转时,Android ViewModel 重新创建

标签 android android-architecture-components android-mvvm

我处于以下场景:

我有一个包含 ViewModelOnboardActivity,我可以多次旋转这个 OnboardActivityViewModel跨配置更改持续存在而不会出现问题。

但是,如果我使用 startActivityForResult(...) 在这个 (OnboardActivity) 之上启动另一个 Activity(FirebaseAuthActivity),然后在 FirebaseAuthActivity 中旋转设备并按下后退按钮。当 OnboardActivity 被带到堆栈的顶部时,它会再次重新创建 ViewModel 实例。

这是 ViewModel 在架构组件中的正常行为吗?

OnboardActivity 从堆栈中弹出且屏幕方向不同于保存时的屏幕方向时,有没有一种方法可以告诉它不完成?

最佳答案

我已经回答过类似的问题here , 这可能会帮助您现在修复自己。

这是来自 android 框架的错误。 Bug details

修复在 28.0.0-alpha3 和 AndroidX 1.0.0-alpha3 中可用

但是如果你不想自己更新到以上版本,那么你可以这样解决(我知道这是一个不好的解决方案,但我没有看到任何其他好的方法)

在调用 super.onDestroy 之前,在您的 Activity 中覆盖 onDestroy 方法并将所有必需字段保存到局部变量。现在调用 super.onDestroy 然后再次初始化您的 ViewModel 并将所需的字段分配回您的新 ViewModel 实例

关于isFinishing

以下代码是 Kotlin 语言:

override fun onDestroy() {

  if (!isFinishing) { //isFinishing will be false in case of orientation change
      val oldViewModel = obtainViewModel()

      val requiredFieldValue = oldViewModel.getRequiredFieldValue()

      super.onDestroy

     val newViewModel = obtainViewModel()

     if (newViewModel != oldViewModel) { //View Model has been destroyed
          newViewModel.setRequiredFieldValue(requiredFieldValue)
      }
  } else {
     super.onDestroy
  }
 }

private fun obtainViewModel(): SampleViewModel {
      return ViewModelProviders.of(this).get(SampleViewModel::class.java)
}

关于当其主机 Activity 不在 Activity 堆栈的顶部并且设备旋转时,Android ViewModel 重新创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48200085/

相关文章:

android - SavedStateHandle 返回空值

android - 让每个观察者在订阅/观察时只接收 *new* LiveData

MVVM 中存储库级别或 Activity 内部的 Android 权限?

android - 如何在另一个 ViewModel 中使用来自一个 ViewModel 的数据

java - 空白字段,java导致应用崩溃

java(安卓): try compressed I/O and failed

android - 在应用程序中返回按钮

android - 无法使用 ContentProviderOperation 删除整个联系人

android - Kotlin 中的 ViewModel : Unresolved Reference

Android BottomNavigation 未使用导航 Controller 正确突出显示