在我的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
每次都被证明是假的。这有什么不对?
答案 0 :(得分:0)
以下答案取自onSaveInstanceState () and 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
。