onSaveInstanceState()和onRestoreInstanceState()

Bla*_*BRA 136 android states android-activity

我正在尝试保存和恢复Activity使用方法onSaveInstanceState()和状态onRestoreInstanceState().

问题是它永远不会进入onRestoreInstanceState()方法.任何人都可以向我解释为什么会这样吗?

Rob*_*ert 189

通常你恢复你的状态onCreate().它也可以恢复onRestoreInstanceState(),但不是很常见.(onRestoreInstanceState()被称为后onStart()而,onCreate()之前被调用onStart().

使用put方法将值存储在onSaveInstanceState():

protected void onSaveInstanceState(Bundle icicle) {
  super.onSaveInstanceState(icicle);
  icicle.putLong("param", value);
}
Run Code Online (Sandbox Code Playgroud)

并恢复以下值onCreate():

public void onCreate(Bundle icicle) {
  if (icicle != null){
    value = icicle.getLong("param");
  }
}
Run Code Online (Sandbox Code Playgroud)

您不必存储视图状态,因为它们是通过调用super.onSaveInstanceState(icicle); 自动存储的.

  • 如果我理解正确,这就是你正在做的事情:从B你调用startActivity(A).然后从A调用finish()返回B.对吗?在这种情况下,您的第一个活动B将不会被销毁,并且onCreate()和onRestoreInstanceState()都不会被调用.这些方法仅在需要时调用,即当一个活动被销毁并需要由系统重新创建时. (5认同)
  • 我应该补充一点,你的第一个活动B可能因内存不足而被破坏.这将触发onCreate和onRestoreInstanceState. (4认同)
  • 问题是我使用startActivity返回活动A.当返回到活动B时,该对象为空冰柱. (2认同)

Ogn*_*yan 147

onRestoreInstanceState()只有在被操作系统杀死重新创建活动才会调用它.这种情况发生在:

  • 设备的方向发生变化(您的活动被破坏并重新创建)
  • 在你面前还有另一项活动,在某些时候,操作系统会杀死你的活动以释放内存(例如).下次开始您的活动时onRestoreInstanceState()将被调用.

相反:如果您正在进行活动并且Back按下设备上的按钮,则您的活动将完成()编辑(即将其视为退出桌面应用程序),下次启动应用程序时,它将以"新鲜"开始,即没有保存状态,因为你在击中时故意退出Back.

其他混淆的原因是当一个应用程序失去焦点到另一个应用程序onSaveInstanceState()被调用时,但当你导航回你的应用程序时onRestoreInstanceState()可能不会被调用.这是原始问题中描述的情况,即如果您的活动在其他活动在前面的期间未被杀死onRestoreInstanceState()将不会被调用,因为您的活动几乎"活着".

总而言之,正如文档中所述onRestoreInstanceState():

大多数实现只是使用onCreate(Bundle)来恢复它们的状态,但是在完成所有初始化之后有时可以方便地执行此操作,或者允许子类决定是否使用默认实现.此方法的默认实现执行先前已被onSaveInstanceState(Bundle)冻结的任何视图状态的恢复.

当我读到它时:没有理由覆盖onRestoreInstanceState()除非你是子类Activity,并且预计有人将子类化.

  • @masi当用户返回时,已经有其他方法在Activity上调用(来自另一个活动).onSave/RestoreInstanceState()用于另一个特定目的,就是这样. (4认同)
  • 是的,这似乎是正确的,但它很糟糕.imo它应该在从另一个活动返回活动时运行.有很多情况你需要这个. (3认同)

Kon*_*rov 7

您保存的状态onSaveInstanceState()稍后在onCreate()方法调用时可用.因此,使用onCreate(及其Bundle参数)来恢复活动的状态.

  • 你能给我一个例子(代码片段)吗? (3认同)

Teo*_*ahi 5

从文档使用保存的实例状态恢复活动 UI 状态,它被描述为:

您可以选择实现 onRestoreInstanceState(),而不是在 onCreate() 期间恢复状态,系统会在 onStart() 方法之后调用该方法。仅当有保存的状态需要恢复时,系统才会调用 onRestoreInstanceState() ,因此您不需要检查 Bundle 是否为 null

在此输入图像描述

在此输入图像描述

IMO,这比在 onCreate 中检查这一点更清晰,并且更符合单一责任原则。