onSaveInstanceState()应该在onDestroy()而不是onStop()?

时间:2013-11-05 16:35:16

标签: android

为什么系统在活动进入停止状态时调用onSaveInstanceState()?

由于活动的实例在停止时保持驻留在内存中,并且仅当活动被销毁时其当前状态才会丢失。

因此系统应该在进入 onDestroy()而不是onStop()之前调用onSaveInstanceState()。

不是吗?

3 个答案:

答案 0 :(得分:8)

由于无法保证onDestroy()被调用(通常,仅当您finish()您的活动时),并且因为onStop()之后,您的活动无法保证。一旦它不是前台活动,它可能会因各种原因而被销毁。

我总是假设在onPause()之后,下一个回复可能onCreate(),这样,我就不会感到惊讶;)

答案 1 :(得分:3)

onSaveInstanceState保存片段/活动的视图状态以及自定义实例数据。视图对象可以在onStop之后销毁,因此必须调用onSaveInstanceState来保留其状态。

这在the docs for Activity.onSaveInstanceState中讨论:

  

默认实现通过在具有id的层次结构中的每个视图上调用onSaveInstanceState()并通过保存当前聚焦视图的id(全部)来为您处理大多数UI每实例状态。这是由onRestoreInstanceState(Bundle)的默认实现恢复的。如果您覆盖此方法以保存每个单独视图未捕获的其他信息,您可能希望调用默认实现,否则请准备保存所有你自己每个观点的状态。

答案 2 :(得分:0)

要保存有关活动状态的其他数据,必须覆盖onSaveInstanceState()回调方法。系统在用户离开您的活动时调用此方法,并将其传递给Bundle对象,该对象将在您的活动意外销毁时保存。如果系统必须稍后重新创建活动实例,它会将相同的Bundle对象传递给onRestoreInstanceState()和onCreate()方法。