我们可以通过 activity 销毁来持久化一个大的状态对象吗?

Can we persist a large state object through activity destruction?

问题:有时/在某些设备上 activity 调用 startActivityForResult (activity A) 来启动 activity B 在调用 startActivityForResult 之后 & 在进入 onActivityResult 之前被销毁。我们在 onActivityResult 中得到一个新创建的 activity A 到 return 的实例——这导致我们的 ViewModel(以及所有其他成员变量)丢失。

标准的做法是使用 SavedInstanceState 恢复 ui 状态。由于我们需要恢复的对象的大小,在这种情况下无法完成此操作 - 尝试此操作会导致 TransactionTooLargeException。 ViewModel 对于 Serializable 或 Parcelable 来说太大了。

问题:是否可以强制我们的Activity在此工作流程中保持完整?或者是否有另一种设计可以让我们避免这个问题?将 ViewModel 的任何数据保存到磁盘都不是一种选择。

Context:在这个项目中,我们一次存储从相机拍摄的图像列表(作为字节数组),以及关于这些图像的一些相关信息一个视图模型。这些在 RecyclerView 中暂存,当用户完成添加图像时可以将它们上传到其中。我们通过调用 startActivityForResult 启动相机 activity 和 return 结果图像来向此 ViewModel 添加项目。

我们可能只看到 activity A 因开发者选项中的“不保留活动”设置被打开而被销毁的问题,这可能无法准确表示 Android将回收资源(例如,该线程底部的对话 - )。不过,理想情况下,我们希望一切都在此设置下工作。现在如果 activity A 被销毁,我们将丢失我们的成员变量和我们在构建过程中的 ViewModeluilding,并且没有办法恢复它。

将 ViewModel 的数据存储在一个片段中(如此处讨论:)将不起作用,因为我们的 activity 正在被破坏,导致任何关联的片段也被破坏。我们实际上有一个我们正在以这种方式使用的片段,它从服务器加载并保存要从每个图像中选择并与每个图像相关联的对象列表 - 这个片段最终会与 activity 一起重新创建,当它销毁然后再次执行此加载。

不,你想要的是不可能的。如果您使用 startActivityForResult() 启动另一个 Activity 并且 Activity 需要资源,则启动 Activity 将被终止。您无法阻止这种情况。这是标准的 Android 行为并且会发生,尤其是在低端设备上。

如果您的 ViewModel 太大而无法保存为实例状态,您需要将数据放在其他地方:SQLite 数据库或本地文件。然后将文件名或某些键作为已保存实例状态的一部分存储到数据库中,当 Activity 重新启动时,从文件或数据库中恢复数据。

注意:您不应该在内存中保留那么多数据,因为您正在浪费宝贵的资源。内存中只保留你真正需要的数据。