【问题标题】:Is onRestoreInstanceState() called only in case of screen rotation? [duplicate]仅在屏幕旋转的情况下才调用 onRestoreInstanceState() 吗? [复制]
【发布时间】:2013-07-09 07:39:49
【问题描述】:

我有一个关于 Android 活动生命周期的问题。 我想知道,在什么情况下调用onRestoreInstanceState()方法?

文档说

"系统只有在有保存的情况下才会调用onRestoreInstanceState() 状态恢复”

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

【问题讨论】:

    标签: android activity-lifecycle


    【解决方案1】:

    来自链接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");
      }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多