【发布时间】:2013-07-09 07:39:49
【问题描述】:
我有一个关于 Android 活动生命周期的问题。 我想知道,在什么情况下调用onRestoreInstanceState()方法?
文档说
"系统只有在有保存的情况下才会调用onRestoreInstanceState() 状态恢复”
但我想知道这种情况何时会发生。它是否仅适用于屏幕旋转的情况,当前台活动被销毁并重新创建时?
【问题讨论】:
标签: android activity-lifecycle
我有一个关于 Android 活动生命周期的问题。 我想知道,在什么情况下调用onRestoreInstanceState()方法?
文档说
"系统只有在有保存的情况下才会调用onRestoreInstanceState() 状态恢复”
但我想知道这种情况何时会发生。它是否仅适用于屏幕旋转的情况,当前台活动被销毁并重新创建时?
【问题讨论】:
标签: android activity-lifecycle
来自链接here:
onRestoreInstanceState() 仅在被操作系统杀死后重新创建活动时调用。这种情况发生在:
onRestoreInstanceState() 将被调用。相反:如果您在 Activity 中并点击设备上的Back 按钮,您的 Activity 将完成()(即认为它是退出桌面应用程序),并且下次启动您的应用程序时它会启动“新鲜”,即没有保存状态,因为您在点击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");
}
}
您不必存储视图状态,因为它们是自动存储的。
【讨论】: