如何保存活动状态?

时间:2014-06-13 18:19:15

标签: android

在我的Android应用程序中有2个活动。我正在从activity1导航到activity2。我按activity1中的按钮返回activity2。我希望activity1保留以前的状态。我正在使用以下代码来实现这一目标。

此代码用于保存状态。

@Override
public void onSaveInstanceState(Bundle savedInstanceState1) {
    super.onSaveInstanceState(savedInstanceState1);
    if (mode == 3) {
        savedInstanceState1.putInt("totscore", totscore);
        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 6; j++) {
                savedInstanceState1.putInt("ballmatrix" + i + "" + j, ballmatrix[i][j][2]);
            }
        }
    }
}

此代码用于检索状态。

@Override
public void onRestoreInstanceState(Bundle savedInstanceState1) {
    super.onRestoreInstanceState(savedInstanceState1);
    // Restore UI state from the savedInstanceState.
    // This bundle has also been passed to onCreate.
    if (mode == 3 && restore == 1) {
        Log.d("ok", "2");
        if (savedInstanceState1 != null) {
            Log.d("ok", "3");
            totscore = savedInstanceState1.getInt("totscore");

            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 6; j++) {
                    ballmatrix[i][j][2] = savedInstanceState1.getInt("ballmatrix" + i + "" + j);
                }
            }
        }
    }
    drawmatrix();
}

但是当检索完成后,savedInstanceState1 != null每次都被证明是假的。这有什么不对?

2 个答案:

答案 0 :(得分:0)

以下答案取自onSaveInstanceState () and onRestoreInstanceState ()

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

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

相比之下:如果您正在进行活动并点击设备上的“后退”按钮,则您的活动将完成()编辑(即将其视为退出桌面应用程序),并在下次启动应用时启动“新鲜” “,即没有保存状态,因为当你回击时故意退出它。

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

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

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

正如我读到的那样:没有理由覆盖onRestoreInstanceState(),除非你是Activity的子类,并且预计会有人将你的子类子类化。

答案 1 :(得分:0)

只需导航到另一个Activity就不会破坏当前的Activity。这意味着当您重新启动activity2时,activity1仍处于后台(stopped状态,假设activity2为全屏)。它没有被摧毁,所以它的所有状态仍然存在。 onSaveInstanceState() 调用,以防你的Activity被销毁。但是,除非已经被销毁,否则将不会调用onRestoreInstanceState(),因为您的Activity实例仍然存在 - 因此没有需要来恢复状态。

如果仅用于测试,您可以通过转到“开发人员选项”并启用“不要保持活动”来强制在新用户到达时销毁活动。但是,您所看到的是预期的行为。要测试保存和恢复是否正常工作,您可以更改设备方向(这将破坏并重新创建活动),或启用“不要保留活动”#34; “开发者选项”中的选项,然后启动activity2