2

我对 Android 中的活动生命周期有疑问。我想知道,在什么情况下调用 onRestoreInstanceState() 方法?

文件说

“系统仅在存在要恢复的已保存状态时调用 onRestoreInstanceState()”

但我想知道这种情况什么时候会发生。它是否仅适用于屏幕旋转的情况,当前台活动被销毁并重新创建时?

4

1 回答 1

5

这里的链接:

onRestoreInstanceState()仅在被操作系统杀死后重新创建活动时调用。这种情况发生在:

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

相反:如果你在你的活动中并且你点击Back了设备上的按钮,你的活动是完成()ed(即认为它是退出桌面应用程序),下次你启动你的应用程序时它会“重新”启动,即没有保存状态,因为您在点击Back.

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

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

大多数实现将简单地使用 onCreate(Bundle) 来恢复它们的状态,但有时在完成所有初始化之后在此处执行此操作或允许子类决定是否使用您的默认实现会很方便。该方法的默认实现会恢复之前被 onSaveInstanceState(Bundle) 冻结的任何视图状态。

正如我所读到的:没有理由重写onRestoreInstanceState(),除非您是子类化Activity并且预计有人会将您的子类子类化。

不仅如此,还有:

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

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

protected void onSaveInstanceState(Bundle icicle) {
  super.onSaveInstanceState(icicle);
  icicle.putLong("param", value);
}

并恢复中的值onCreate()

public void onCreate(Bundle icicle) {
  if (icicle != null){
    value = icicle.getLong("param");
  }
}

您不必存储视图状态,因为它们是自动存储的。

于 2013-07-09T07:46:27.300 回答