使用`onRetainCustomNonConfigurationInstance`来保留跨配置更改的数据

我已经为Android编程了一段时间,我仍在寻找保留数据而不是配置更改的解决方案。 除了在onSaveInstanceState setRetainInstance s保存到Activity的Bundle ,docs建议使用Fragment并将setRetainInstance标志设置为true。

但我刚刚遇到一些使用onRetainCustomNonConfigurationInstance来保存任意对象的代码(以一种奇特的方式,但基本上是大对象,而不引用Activity等)。 我从未见过这种方法,所以我有些疑惑:

  • 这种方法是否可以安全地调用存储任意对象(从某种意义上说,我可以确定它会被调用,并且不会很快被弃用/删除)?
  • 这个方法与onRetainNonConfigurationInstance()不同,它也应该返回Object ,实质上应该类似吗?
  • 由于某种原因,使用保留片段仍然更好吗?

作为奖励,我将非常感谢任何其他提示或解决方案来保存AsyncTaskObservable ,view的演示者等对象的状态并继续

Solutions Collecting From Web of "使用`onRetainCustomNonConfigurationInstance`来保留跨配置更改的数据"

这种方法是否可以安全地调用存储任意对象(从某种意义上说,我可以确定它会被调用,并且不会很快被弃用/删除)?

onRetainCustomNonConfigurationInstance()是一个相对较新的方法,不推荐使用它。 我真的认为它不会很快消失,因为没有理由引入新的东西来删除它。 你可以安全地使用它。

这个方法与onRetainNonConfigurationInstance()有什么不同,它也应该返回Object,实质上应该类似吗?

onRetainNonConfigurationInstance()始终返回内部NonConfigurationInstances类的实例, NonConfigurationInstances包含保留的片段,加载器等状态。 您不能(也不应该)更改此系统行为。 这就是为什么这个方法是final ,你不能覆盖它。

如果要保留自定义实例,则需要覆盖onRetainCustomNonConfigurationInstance()并从那里返回。

实际上, onRetainNonConfigurationInstance()调用onRetainCustomNonConfigurationInstance()并保留与其他状态(如保留的片段和加载器onRetainCustomNonConfigurationInstance()重新调整的实例。

由于某种原因,使用保留片段仍然更好吗?

这是您的用例和偏好的问题。 逻辑可能是这样的。 如果您的活动只是控制片段并且没有其他特殊逻辑,那么使用保留片段会更容易。 如果您的活动有某些内容需要保留,那么您可以安全地使用onRetainCustomNonConfigurationInstance()方法。 至于现在,在这两种情况下,状态仍然由旧的保留,并且不推荐使用onRetainNonConfigurationInstance()方法。

ps关于存储状态的奖金问题,我宁愿建议查看onSaveInstanceState()方法。 它用于存储状态。