我阅读的所有来源都提到了几个情况,并得出了“其他一些情况”的结论。在View/Activity中,当onSaveInstanceState方法被调用时,所有的情况是什么?
如果视图拥有ID,则onSaveInstanceState()会默认调用。
Google表示:“默认实现通过在层次结构中每个拥有ID的视图上调用onSaveInstanceState()来为大多数UI实例状态提供帮助。”。
更多信息在此处。
onSaveInstanceState
可能会在直接调用片段后被调用onCreate
(onCreateView
,onActivityCreated
,onStart
和onResume
不会被调用),如果片段已附加到活动但未显示,则被销毁。因此,您需要确保在onCreate
中初始化onSaveInstanceState
中引用的所有内容,否则会出现NullPointerException
的风险。根据文档
如果用户与活动交互并按返回按钮,或者如果调用活动的finish()方法,则会从当前活动堆栈中删除并回收活动。在这种情况下,没有实例状态需要保存,因此不会调用onSaveInstanceState()方法。
如果用户与活动交互并按Home按钮,则必须保存活动实例状态。将调用onSaveInstanceState()方法。如果用户重新启动应用程序,则会恢复或重新启动最近运行的活动。如果它重新启动活动,则提供带有保存数据的包到onRestoreInstanceState()和onCreate()方法。
如果您覆盖了onSaveInstanceState()和onRestoreInstanceState()方法,则应调用其超类实现,因为Android默认视图通过调用View.onSaveInstanceState方法从活动的onSaveInstanceState()方法中存储它们的数据。例如,EditText通过此方法的默认调用存储其内容。
当用户按下"返回"按钮时,该方法没有被调用,这是其中一种情况。
当活动不在视图中时,例如按下主页键时,onSaveInstanceState将被调用。
onSaveInstanceState()
无论您的应用程序进程是否被杀死都会被调用。因此,在所有这些情况下,都会调用onSaveInstanceState()
:
正常后台场景
onSaveInstanceState()
进程被杀死的后台场景
onSaveInstanceState()
onRestoreInstanceState()
和onCreate()
(使用保存的实例状态包)配置更改场景
onSaveInstanceState()
onRestoreInstanceState()
和onCreate()
(使用保存的实例状态包)区别在于是否调用onCreate()/onRestoreInstanceState()
。在进程终止和配置方案中,它们被调用。在正常情况下,无需重新创建活动,也不会调用它们。
请注意,当您的活动进入后台时,将调用onSaveInstanceState()
,而不是在应用程序进程即将被杀死时。这是因为在您的应用程序进程被杀死的情况下,系统已经非常受限,此时花费周期将键/值对存储在RAM中并不是一个好时机。