为什么Activity进入停止状态时系统会调用onSaveInstanceState()?
由于活动的实例在停止时一直驻留在内存中,并且只有在活动被销毁时才会丢失其当前状态。
所以系统应该在进入或进入onDestroy() 之前调用 onSaveInstanceState() 而不是 onStop()。
不是吗?
为什么Activity进入停止状态时系统会调用onSaveInstanceState()?
由于活动的实例在停止时一直驻留在内存中,并且只有在活动被销毁时才会丢失其当前状态。
所以系统应该在进入或进入onDestroy() 之前调用 onSaveInstanceState() 而不是 onStop()。
不是吗?
因为onDestroy()
不保证会被调用(通常,仅当finish()
您进行活动时)并且因为在 之后onStop()
,不保证您的活动会保留。一旦它不是前台活动,它可能会由于多种原因而被破坏。
我总是假设,之后onPause()
,下一个回调可能是onCreate()
,那样,我永远不会感到惊讶;)
onSaveInstanceState
保存 Fragment/Activity 的视图状态以及自定义实例数据。视图对象可以并且将在 之后被销毁onStop
,因此onSaveInstanceState
必须调用以保留它们的状态。
这在以下文档中进行Activity.onSaveInstanceState
了讨论:
默认实现通过调用
onSaveInstanceState()
层次结构中具有 id 的每个视图并保存当前聚焦视图的 id(所有这些都由onRestoreInstanceState(Bundle)
. 如果您重写此方法以保存每个单独视图未捕获的附加信息,您可能希望调用默认实现,否则请准备好自己保存每个视图的所有状态。
要保存有关活动状态的其他数据,您必须重写 onSaveInstanceState() 回调方法。当用户离开您的活动时,系统会调用此方法,并将 Bundle 对象传递给它,该对象将在您的活动被意外销毁时保存。如果系统必须稍后重新创建活动实例,它会将相同的 Bundle 对象传递给 onRestoreInstanceState() 和 onCreate() 方法。