一旦将游戏放在后台,我将使用onSaveInstanceState和onRestoreInstanceState来保持关卡数据。一切似乎都正常,但是当您使用电源按钮锁定手机时,我遇到了一个一致的问题。除了打电话给保存,我还同时收到一个要还原的电话,然后又得到另一个保存的电话,然后当我再次解锁手机时,我得到了另一个保存的电话,最后又得到了还原的电话。我已经使用Log标签检查了我的值,并且我的ArrayList第一次在锁定手机后第二次调用保存之后返回为空。这是我的堆栈跟踪:
//Locks Phone
10-23 08:34:03.797: DEBUG/input(6535): saveLevel[001, 001, 001, 001, 001, 001, 001, 000, 000, 000, 000, 001, 000, 001, 001, 001, 001, 000, 000, 000, 000, 000, 000, 000, 001, 001, 001, 001, 001, 001, 000, 000, 000, 001, 000, 001, 001, 001, 001, 001, 001, 001, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000]
10-23 08:34:04.813: DEBUG/input(6535): RestoredLevel[001, 001, 001, 001, 001, 001, 001, 000, 000, 000, 000, 001, 000, 001, 001, 001, 001, 000, 000, 000, 000, 000, 000, 000, 001, 001, 001, 001, 001, 001, 000, 000, 000, 001, 000, 001, 001, 001, 001, 001, 001, 001, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000]
10-23 08:34:05.602: DEBUG/input(6535): saveLevel[]
//Unlocks Phone
10-23 08:34:14.656: DEBUG/input(6535): saveLevel[]
10-23 08:34:14.836: DEBUG/input(6535): RestoredLevel[]
当我通过其他方式退出应用程序时,不会发生相同的事情。
这是我的onSave和OnRestore方法:
@Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
levelDat = CSVReader.getleveldat(); //CSVReader is the class that creates the ArrayList
outState.putStringArrayList("LEVELDATA", levelDat);
Log.d(TAG, "saveLevel" + String.valueOf(levelDat));
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
levelDat = savedInstanceState.getStringArrayList("LEVELDATA");
MRenderer.recoverLevel(); // just a method to force update my level data in my renderer.
Log.d(TAG, "RestoredLevel" + String.valueOf(levelDat));
}
有没有一种方法可以阻止这种情况的发生,如果不能的话,我可以通过一些技巧来帮助我的代码识别丢失的数据并重新读取CSV文件。
最佳答案
在这篇文章(http://ogrelab.ikratko.com/activity-lifecycle-explained-in-details/)中,有一个示例项目,该项目通过logcat生命周期事件以及何时以及调用哪种方法进行演示。长话短说:您需要在onCreate()
中而不是在onRestoreInstanceState()
中恢复状态。
这是电话锁定时的日志示例:
10-23 10:50:20.847: I/TEST(913): A onSaveInstanceState
10-23 10:50:20.847: I/TEST(913): A onPause
10-23 10:50:20.847: I/TEST(913): A onStop
10-23 10:50:20.847: I/TEST(913): A onDestroy | isFinishing: false
10-23 10:50:20.859: I/TEST(913): A onCreate
10-23 10:50:20.859: I/TEST(913): A onStart
10-23 10:50:20.859: I/TEST(913): A onRestoreInstanceState
10-23 10:50:20.863: I/TEST(913): A onResume
10-23 10:50:21.210: I/TEST(913): A onSaveInstanceState
10-23 10:50:21.210: I/TEST(913): A onPause
如您所见,调用
onSaveInstanceState()
后,您的活动被杀死,然后再次创建,并且由于您错过了恢复onCreate()
中的状态的机会,因此ArrayList为空。通常,在某些特殊情况下,当某些奇特的/奇怪的UI需要对其状态进行非标准恢复时,通常使用
onRestoreInstanceState()
。