【发布时间】:2018-05-28 10:00:00
【问题描述】:
我有一个托管在活动内部的片段。当用户按下后退按钮时,我需要保存模型数据并在下次用户打开片段/活动时使其可用。但就在应用程序中,它不需要持久化到磁盘。因此,例如如果用户破坏了进程,则无需保留模型数据,可以再次从网络中获取。
我尝试过的:
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() 回调进行转换。除了被销毁之外,Activity 也会从返回栈中移除。
需要注意的是,默认情况下,onSaveInstanceState() 在这种情况下不会触发回调。
来源:here
【问题讨论】:
-
您想要应用程序生命周期的数据持久性?单身人士?
-
我试图避免这种模式,因为它使事情难以测试。但也是个好主意
-
onSaveInstanceState() 仅在活动被临时销毁时调用,例如在方向更改期间,因此您需要在片段的 onPause() 方法中显式调用 onSaveInstanceState(),因为不能保证 onDestroy()总是被调用。
-
我尝试在片段的 ondestroy() 中调用 onSaveInstanceState()。它被调用(按下后退按钮)但下次我加载活动时,捆绑包仍然为空。我不能手动调用它吗?在 api 27 上测试