什么情况下会调用onSaveInstanceState()方法?

12

我阅读的所有来源都提到了几个情况,并得出了“其他一些情况”的结论。在View/Activity中,当onSaveInstanceState方法被调用时,所有的情况是什么?

8个回答

7

7

如果视图拥有ID,则onSaveInstanceState()会默认调用。

Google表示:“默认实现通过在层次结构中每个拥有ID的视图上调用onSaveInstanceState()来为大多数UI实例状态提供帮助。”。

更多信息在此处


虽然这是准确的信息,但它并没有回答问题。 - Jazzer

6
请注意,onSaveInstanceState可能会在直接调用片段后被调用onCreateonCreateViewonActivityCreatedonStartonResume不会被调用),如果片段已附加到活动但未显示,则被销毁。因此,您需要确保在onCreate中初始化onSaveInstanceState中引用的所有内容,否则会出现NullPointerException的风险。

我有一个应用程序,在其中在onCreate中初始化的对象上看到了onSaveInstanceState中的NPE。这真的很奇怪,只有在onSaveInstanceState在onCreate之前调用时才有意义。你有任何线索为什么会发生这种情况吗? - Shivam Pokhriyal

5

文档中说明:

在活动可能被销毁之前,调用此方法,以便在将来的某个时间恢复其状态。


3
  • 当屏幕方向发生变化或用户按下home键时,将调用onSaveInstanceState()。
  • 如果一个活动被隐藏且操作系统为释放内存(或需要内存)而终止了该隐藏的活动,那么将调用onSaveInstanceState()方法,以便活动可以保存其状态信息。当用户下次启动该活动时,通过onRestoreInstanceState()方法恢复状态信息。
  • Android默认视图通过调用View.onSaveInstanceState来保存它们的状态,该状态可通过onRestoreInstanceState()方法的默认实现进行恢复。

根据文档

如果用户与活动交互并按返回按钮,或者如果调用活动的finish()方法,则会从当前活动堆栈中删除并回收活动。在这种情况下,没有实例状态需要保存,因此不会调用onSaveInstanceState()方法。

如果用户与活动交互并按Home按钮,则必须保存活动实例状态。将调用onSaveInstanceState()方法。如果用户重新启动应用程序,则会恢复或重新启动最近运行的活动。如果它重新启动活动,则提供带有保存数据的包到onRestoreInstanceState()和onCreate()方法。

如果您覆盖了onSaveInstanceState()和onRestoreInstanceState()方法,则应调用其超类实现,因为Android默认视图通过调用View.onSaveInstanceState方法从活动的onSaveInstanceState()方法中存储它们的数据。例如,EditText通过此方法的默认调用存储其内容。


1

当用户按下"返回"按钮时,该方法没有被调用,这是其中一种情况。


1

当活动不在视图中时,例如按下主页键时,onSaveInstanceState将被调用。


1
当活动离开视图时,并不是每次都会被调用。例如,当用户按下返回键离开活动时。 - Jazzer

0
这里:答案是onSaveInstanceState()无论您的应用程序进程是否被杀死都会被调用。因此,在所有这些情况下,都会调用onSaveInstanceState()

正常后台场景

  1. 您的活动转到后台并调用onSaveInstanceState()
  2. 您做其他事情
  3. 您的用户导航回到您的活动

进程被杀死的后台场景

  1. 您的活动转到后台并调用onSaveInstanceState()
  2. 您做其他事情,而此时系统开始资源不足并关闭了您的应用程序进程
  3. 您的用户导航回到该活动时,将调用onRestoreInstanceState()onCreate()(使用保存的实例状态包)

配置更改场景

  1. 发生配置更改并调用onSaveInstanceState()
  2. 调用onRestoreInstanceState()onCreate()(使用保存的实例状态包)

区别在于是否调用onCreate()/onRestoreInstanceState()。在进程终止和配置方案中,它们被调用。在正常情况下,无需重新创建活动,也不会调用它们。 请注意,当您的活动进入后台时,将调用onSaveInstanceState(),而不是在应用程序进程即将被杀死时。这是因为在您的应用程序进程被杀死的情况下,系统已经非常受限,此时花费周期将键/值对存储在RAM中并不是一个好时机。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接