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

was*_*syl 23 android android-framework android-activity android-fragmentactivity

我已经为Android编程了一段时间,我仍在寻找保留数据而不是配置更改的解决方案.除了节约Parcelables到活动的BundleonSaveInstanceState文档使用暗示FragmentsetRetainInstance标志设置为true.

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

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

作为奖励,我将不胜感激任何其他提示或解决方案,以节省状物体的状态AsyncTask,Observable,视图的主持人,并继续

ser*_*nka 19

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

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

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

onRetainNonConfigurationInstance()总是返回一个NonConfigurationInstances带有保留片段,加载器等状态的内部类的实例.您不能(也不应该)更改此系统行为.这就是该方法的原因final,你无法覆盖它.

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

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

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

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

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

更新: 从2018年11月5日开始的AndroidX版本弃用了该方法,注释如下:onRetainCustomNonConfigurationInstance已被弃用.使用ViewModel存储需要在配置更改后存活的对象.

  • 截至2018年11月,不推荐使用`onRetainNonConfigurationInstance`方法:https://developer.android.com/jetpack/androidx/androidx-rn#2018-nov (3认同)