【问题标题】:Why onRestoreInstanceState() never gets called为什么 onRestoreInstanceState() 永远不会被调用
【发布时间】:2011-04-07 00:19:56
【问题描述】:

我正在尝试在我的活动中保存数据而不是恢复它。 我将数据保存在onSaveInstanceState() 中,然后尝试恢复onRestoreInstanceState() 中的数据。

我设置断点,方法onSaveInstanceState()被调用。但是onRestoreInstanceState()onCreate() 从来没有。

这是我的步骤:

  1. 开始我的Activity
  2. 按手机上的“主页”按钮。 onSaveInstanceState() 被调用。
  3. 单击启动器中的图标并再次启动我的Activity

此时,只有onRestart() 被调用。但不是onRestoreInstanceState()onCreate()

有人知道为什么吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    好吧,如果调用onRestart(),实例变量的值将由应用程序堆栈本身维护,因此您不需要恢复它们。

    onCreate() 方法只有在你的ActivityonStop() 被调用并且进程被杀死时才会被调用。

    请参考Activity生命周期Android Activity Life Cycle以获得清晰的理解。

    您可能需要检查是否调用了onStop() 方法以及您的进程是否被终止。我认为您的进程不会被您描述的场景杀死。

    onRestoreInstanceState() 方法非常棘手。我不知道它是什么时候被调用的,但我看到它在从 Potrait 更改为 Landscape 时被调用过一次。

    【讨论】:

    • stackoverflow.com/questions/4967435/… - onRestoreInstanceState 的用途有一个答案。
    • 您的答案并不完全准确或至少不清楚,因为在 onStop() 之后将调用 onRestart() 或 onDestroy()。如果 onDestroy() 被调用然后你回到 onCreate()
    • 谢谢。 onRestore... 似乎在方向改变时被调用。对我来说简化的事情没完没了(+:
    【解决方案2】:

    来自doc:

    只有在有保存的状态需要恢复时,系统才会调用 onRestoreInstanceState()。

    【讨论】:

    • 如果永远不会调用 onRestoreInstanceState(),为什么还要调用 onSaveInstanceState()?这很疯狂。如果我切换到另一个活动,则调用 onSaveInstanceState() 让我认为当我回来时我将能够访问已保存的实例状态。但它永远不会遇到任何 restore/onCreate 函数,因为它正在重新启动。它在文档中也没有得到很好的解释。
    【解决方案3】:

    我之前在here上问过类似的问题

    以下是测试onRestoreInstanceState()的一些步骤:

    1. 按主屏幕
    2. 通过 adb 杀死应用
    3. 再次启动您的应用

    【讨论】:

      【解决方案4】:

      按照以下步骤(使用 Android Studio):

      1. 创建新的 Logcat 过滤器,例如应用状态
      2. 在您的模拟器上启动该应用。你会看到:

        I/AppState﹕onCreate

        I/AppState﹕onStart

        I/AppState: onResume

      3. 按 Ctl-F12 旋转模拟器。你会看到:

        I/StateChange:onPause

        I/StateChange:onSaveInstanceState

        I/StateChange:onStop

        I/StateChange:onDestroy

        I/StateChange:onCreate

        I/StateChange:onStart

        I/StateChange:onRestoreInstanceState

        I/StateChange: onResume

      这会通过对设备进行配置更改(例如从纵向旋转到横向)来破坏和重新创建 Activity。

      【讨论】:

        【解决方案5】:

        请参阅下面的链接,了解如何在真实设备或模拟器中测试onSaveInstanceState()onRestoreInstanceState()

        此方法使用 AlwaysFinish 设置,比杀死进程更简单快捷。该方法还提供Activity级控制而不是进程级控制:

        http://bricolsoftconsulting.com/how-to-test-onsaveinstancestate-and-onrestoreinstancestate-on-a-real-device/

        【讨论】:

        • 您的链接已失效。
        【解决方案6】:

        这是我在真实设备上的解决方案,所以调用 onRestoreInstanceState。

        1. manifest相关活动中删除这部分android:configChanges="orientation"
        2. manifest的相关活动中删除这部分android:screenOrientation="portrait"
        3. 在您的活动中删除此行,如果它存在 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        4. 在您的设备上启用旋转设置 - 显示 - 自动旋转。

        然后运行您的应用,旋转您的设备。 就是这样。

        【讨论】:

        • 谢谢,但不适用于 Android 模拟器。或者,这种行为可能会随着 Android 版本的变化而不断变化。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-22
        • 2018-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-16
        • 2014-08-23
        相关资源
        最近更新 更多