我有一个驻留在活动内部的片段。当用户按下back按钮时,我需要保存模型数据,以便下次用户打开片段/活动时可以使用。但只要在应用程序中,它就不需要持久存储在磁盘上。例如,如果用户破坏了进程,则不需要保留模型数据,可以再次从网络中获取这些数据。
我尝试过的方法:icePick和onSavedInstance
调用,但当用户按下片段上的后退按钮时,这些调用似乎不起作用。如果我错了,请告诉我。
下面是我在片段中实现的内容:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("myModel", Parcels.wrap(myModel));
}
我使用的是parceler库,如果这有什么不同的话。如果需要,我还可以将代码转换为kotlin。当我点击back按钮时,片段会从堆栈中弹出,包含它的activity会调用onDestroy,但我在onSaveInstanceState中没有得到任何回调。此外,当我签入时,onCreate()
savedInstanceState
is null。我没有在活动中重写onSavedInstance
,只是在片段中重写。我做错了什么?
我有一个想法是使用数据库来做这件事,但我只是在内存中需要它,应该有一种方法可以在没有数据库的情况下做到这一点。
根据我所了解到的,如果用户点击后退按钮,系统将不会调用onSaveInstance:
如果某个活动位于前台,并且用户点击了Back按钮,则该活动将通过onPause()、onStop()和onDestroy()回调进行转换。除了被销毁之外,该活动还会从后台堆栈中删除。
需要注意的是,在默认情况下,onSaveInstanceState()回调在这种情况下不会触发。
来源:here
发布于 2018-05-27 23:51:00
片段的#onSaveInstanceState
严格耦合到活动生命周期
调用
以在被终止之前从活动中检索每个实例的状态
您只对片段进行操作,活动保持不变,因此此方法肯定不能在您的情况下使用,也不应该使用。
我的建议是通过接口使用某种类型的持久存储。它可以在内存存储中(任何类型的单例,就像评论中建议的那样。它的作用域可能是应用程序或活动,也可能是自定义案例(您必须手动控制缓存生命周期)并注入dagger (例如)、基于共享首选项的存储、数据库存储。很容易测试你是否遵循依赖注入模式&使用像MVP这样的结构模式(但这不是这个问题的重点)
因此,在更改时将数据存储在存储库中或存储在onPause
方法中(因为当屏幕消失时,它是最后一个保证调用的方法)。并在onCreate
中恢复它
https://stackoverflow.com/questions/50553577
复制相似问题