使用saveInstance和片段的参数进行保存有什么区别?

时间:2018-10-17 12:13:59

标签: android android-savedstate

在Android Fragment中,它具有onSaveInstanceState(),可在操作系统重新创建片段时保存一些数据以恢复状态。

onSaveInstanceState(outState: Bundle) {
    outState.putString("dataStr", dataStr)
}

片段的参数中已经有什么数据?重新创建该片段后,似乎也恢复了先前的参数。

// set the argument
Bundle bundle = new Bundle();
bundle.putString("dataStr", dataStr);
AFragment aFragment = new AFragment();
aFragment.setArguments(bundle);

//get the argument inside the AFragment
Bundle bundle=getArguments();  

这是否意味着如果片段的参数中包含任何内容,则不需要通过onSaveInstanceState()保存它们?

问题:由于可以在片段内更新参数,是否可以将数据保存在参数中而不是通过onSaveInstanceState()保存?

或者使用这两者有什么区别?

2 个答案:

答案 0 :(得分:1)

onSaveInstanceState() / onRestoreInstanceState()仅在需要重新创建Activity / Fragment(尤其是在配置更改时)时才由Android显式调用。开始输入内容,然后更改屏幕的方向。如果您不处理保存状态,他将失去其输入。

另一方面,

片段args 用于实例化片段,即使重新创建了Fragment,但args仍然可用。 >

因此,如果要创建带有某些 args (例如用户名...)的新片段,则需要使用args。

但是,如果要保存当前状态(用户输入...)以防碎片重新生成,则需要通过 SaveInstance 方法对其进行处理。

为进一步了解保存/还原的工作原理,我建议使用此article

答案 1 :(得分:0)

savedInstance :当您在活动之间频繁来回移动时,saveInstanceState并在关闭应用程序时记住这一点,这意味着它会从内存中删除,信息也会丢失。

捆绑包: enter image description here 捆绑包使用地图保存您要放入的附加内容。因此,地图和捆绑包之间没有区别。但是当您要将数据发送到另一个Activity(或任何其他IPC组件,例如Service,BroadcastReceiver等)时,地图将通过包裹打包为byte [],并发送到目的地。在目标位置,数据将以相反的方向进入相同的流,并且byte []将被解组到Map中,您可以通过提供相同的键来获得额外的好处。

因此Bundle就像一个Map,也可以在byte []中进行编组/拆组。一个重要的注意事项是,您不能使用此byte []来保留包,因为它仅设计用于传输到组件,并且在基础数据结构发生更改时将不起作用。