当Activity停止并恢复时保存SurfaceView的状态

时间:2011-08-20 21:59:44

标签: android android-activity

我有一个由游戏引擎(线程)管理的SurfaceView的Activity。我重写了onCreate和onSaveInstanceState来管理线程的保存/恢复状态。

当从该Activity的菜单访问首选项屏幕时,该Activity将通过其生命周期进入onStop;当首选项屏幕关闭时,活动将在onResume上再次启动,因此onCreate不会发生。但是线程处于TERMINATED状态,因此无法恢复。

是的,我可以创建一个新的线程实例 - 但是如何恢复状态呢?我也试过覆盖onRestoreInstanceState,但经过快速测试并稍微阅读后,我意识到在这种情况下没有调用它,因为它是在onStart和onResume之间调用的。

处理此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

我认为您确实需要定位onSaveInstanceStateonRestoreInstanceState或使用onCreate功能来执行此操作(onRestoreInstanceStateonStart之后调用,而在onCreate之前调用onStart - 所以你需要使用onCreate做事的方式,虽然我会在下面列出这两种方式)

将您的状态保存在活动的onSaveInstanceState中 - 您可能需要在getView类中编写getter方法:

protected void onSaveInstanceState(Bundle outState) {
  outState.putInt(YourSurfaceViewClass.SOME_ID, surfaceViewClass.getVar());
  super.onSaveInstanceState(saveBundle);
}

恢复onCreate中的值:

public void onCreate(Bundle savedInstanceState) {
  if (savedInstanceState != null){
    value = savedInstanceState.getInt(YourSurfaceViewClass.SOME_ID);
  }
}

restoreInstanceState

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    value = savedInstanceState.getInt(YourSurfaceViewClass.SOME_ID);
}

当您访问首选项屏幕然后使用onCreate恢复线程状态时,将调用这些方法。

答案 1 :(得分:0)

问题似乎与我的应用程序的脏设计有关。由于游戏引擎本身正在扩展Thread类并自动设置为TERMINATED,因此我对当前设计的唯一选择是为surfaceCreated方法添加逻辑。在那里,我可以检查线程的状态:

如果是TERMINATED,我可以创建一个Bundle并将其传递给我的引擎的saveState方法。一旦我拥有状态,我就将线程作为一个新的游戏引擎线程并传入最近保存的Bundle。我认为继续正常(启动线程)。

这样可行,但最好的方法是将实际的Thread逻辑移动到一个单独的类中。由于游戏引擎实际上并未被清除,我只是创建一个新的Thread实例,而不是重新创建整个游戏引擎,所以这就是我要做的。