![](/img/trans.png)
[英]Fragment's onActivityCreated() is called after onDestroy() of Activity
[英]fragment - best way to save/restore model after onDestroy of activity?
我有一个活动内部托管的片段。 当用户按下后退按钮时,我需要保存模型数据,并在下次用户打开片段/活动时使它可用。 但是就在应用程序中时,它不需要保留到磁盘上。 因此,例如,如果用户破坏了该过程,则无需保留模型数据,则可以再次从网络中获取模型数据。
我曾尝试过: icePick和onSavedInstance
调用,但是当用户按下片段上的“后退”按钮时,这些调用似乎没有启动。 告诉我我是否错了。
这是我在片段中实现的内容:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("myModel", Parcels.wrap(myModel));
}
我正在使用包裹库,如果有任何区别。 如果需要,我还可以将代码转换为kotlin。 当我按下“后退”按钮时,片段从堆栈中弹出,并且活动包含该片段,它调用onDestroy,但是即时通讯在onSaveInstanceState中没有得到任何调用。 另外,当我签入onCreate()
savedInstanceState
为null。 我没有在活动中覆盖onSavedInstance
,只是在片段中。 我究竟做错了什么 ?
我曾经使用数据库来执行此操作,但是我只需要在内存中使用它即可,并且应该有一种无需数据库即可执行此操作的方法。
从我学到的内容,如果用户点击后退按钮onSaveInstance,系统不会调用它:
如果活动位于前台,并且用户单击“后退”按钮,则该活动将通过onPause(),onStop()和onDestroy()回调进行转换。 除了被销毁之外,该活动还从后堆栈中删除。
重要的是要注意,默认情况下,onSaveInstanceState()回调在这种情况下不会触发。
资料来源: 这里
片段的#onSaveInstanceState
与活动生命周期严格相关
根据文档
在被杀死之前被调用以从活动中检索每个实例的状态
您只能使用片段操作,并且活动不会受到影响,因此绝对不能使用这种方法,也不应该这样做。
我的建议是通过接口使用某种持久性存储。 它可以在内存存储中(任何类型的单例,如注释中建议的那样。它的范围可能限于应用程序或活动或自定义情况(例如,您必须手动控制缓存的生命周期),并使用匕首注入),共享首选项基于存储,数据库存储。 测试是否遵循依赖性注入模式并使用MVP之类的结构模式很容易(但这不是这个问题的重点)
因此,将数据更改后存储在存储库中或onPause
方法中(因为这是最后保证在屏幕消失时调用的数据)。 并将其还原到onCreate
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.