我有一个托管在活动中的片段。当用户按下后退按钮时,我需要保存模型数据,并在下次用户打开片段/活动时使其可用。但就在应用程序中,它不需要持久化到磁盘。因此,例如,如果用户破坏了该过程,则不需要保留模型数据,它可以再次从网络中获取。
我尝试过的:
icePick和onSavedInstance
调用,但当用户按下片段上的后退按钮时,这些似乎不会启动。告诉我,如果我错了。
这是我在片段中实现的内容:
@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
答案 0 :(得分:1)
#onSaveInstanceState
严格地与活动生命周期相联系
According to doc
被调用以从活动中检索每个实例状态 杀死
您只使用片段进行操作,活动保持不变, 所以这种方法绝对不能在你的情况下使用,也不应该使用。
我的建议是通过接口使用某种持久存储。它可以在内存存储中(任何类型的单例,如注释中建议的。它可以限定为应用程序或活动或自定义案例(您必须控制手动缓存生命周期)并注入匕首,例如),共享首选项基于存储,数据库存储。如果你遵循依赖注入模式,那么很容易测试。使用像MVP这样的结构模式(但这不是这个问题的重点)
因此,在更改时或onPause
方法中将数据存储在存储库中(因为它是屏幕消失时保证调用的最后一个)。并在onCreate