片段 - onDestroy活动后保存/恢复模型的最佳方法?

时间:2018-05-27 15:14:04

标签: android android-fragments

我有一个托管在活动中的片段。当用户按下后退按钮时,我需要保存模型数据,并在下次用户打开片段/活动时使其可用。但就在应用程序中,它不需要持久化到磁盘。因此,例如,如果用户破坏了该过程,则不需要保留模型数据,它可以再次从网络中获取。

我尝试过的: icePickonSavedInstance调用,但当用户按下片段上的后退按钮时,这些似乎不会启动。告诉我,如果我错了。

这是我在片段中实现的内容:

 @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
           outState.putParcelable("myModel", Parcels.wrap(myModel));
    }

我正在使用parceler库,如果这有任何区别的话。如果需要,我也可以将代码转换为kotlin。 当我点击后退按钮时,片段从堆栈中弹出,活动包含它调用onDestroy,但我没有在onSaveInstanceState中回复任何内容。此外,当我办理登机时onCreate() savedInstanceState为空。我没有在活动中覆盖onSavedInstance,只是在片段中。我究竟做错了什么 ?

我有一个虽然使用数据库来做到这一点,但我只是需要它在内存中应该有一种方法来做到这一点没有数据库。

如果用户点击后退按钮onSaveInstance,我所学到的东西不会被系统调用:

  

如果活动位于前台,并且用户点击“返回”按钮,则活动将转换为onPause(),onStop()和onDestroy()回调。除了被销毁外,活动也会从后台移除。

     

重要的是要注意,默认情况下,onSaveInstanceState()   在这种情况下,回调不会触发。

来源:here

1 个答案:

答案 0 :(得分:1)

片段的

#onSaveInstanceState严格地与活动生命周期相联系 According to doc

  

被调用以从活动中检索每个实例状态   杀死

您只使用片段进行操作,活动保持不变, 所以这种方法绝对不能在你的情况下使用,也不应该使用。

我的建议是通过接口使用某种持久存储。它可以在内存存储中(任何类型的单例,如注释中建议的。它可以限定为应用程序或活动或自定义案例(您必须控制手动缓存生命周期)并注入匕首,例如),共享首选项基于存储,数据库存储。如果你遵循依赖注入模式,那么很容易测试。使用像MVP这样的结构模式(但这不是这个问题的重点)

因此,在更改时或onPause方法中将数据存储在存储库中(因为它是屏幕消失时保证调用的最后一个)。并在onCreate

中恢复它