在 Activity 停止和恢复时保存 SurfaceView 的状态

Posted

技术标签:

【中文标题】在 Activity 停止和恢复时保存 SurfaceView 的状态【英文标题】:Saving the state of a SurfaceView when the Activity is stopped and resumed 【发布时间】:2011-10-31 09:18:34 【问题描述】:

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

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

是的,我可以创建线程的一个新实例——但是我怎样才能恢复状态呢?我也尝试覆盖 onRestoreInstanceState,但经过快速测试和更彻底的阅读后,我意识到在这种情况下不会调用它,因为它是在 onStart 和 onResume 之间调用的。

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

【问题讨论】:

【参考方案1】:

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

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

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 恢复线程状态时,将调用这些方法。

【讨论】:

感谢您的回复。正如我在帖子中提到的,我已经尝试过了。在这种情况下不会调用 onCreate,也不会调用 onRestoreInstanceState [因为它直接进入 onResume]。【参考方案2】:

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

如果是TERMINATED,我可以创建一个Bundle 并将它传递给我的引擎的saveState 方法。获得状态后,我将线程设为新的游戏引擎线程并传入最近保存的Bundle。我认为照常继续(启动线程)。

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

【讨论】:

您在问题中没有提到游戏引擎!您的问题是一般问题,但您在特殊情况下解决了它。 这里的问题在于线程,而不是游戏引擎实现;在这种情况下,我提出的解决方案是在实现任何管理状态的游戏引擎实现时不要从 Thread 继承。

以上是关于在 Activity 停止和恢复时保存 SurfaceView 的状态的主要内容,如果未能解决你的问题,请参考以下文章

Android处理运行时变更保存数据状态恢复Activity

Android中突发情况Activity数据的保存和恢复

android笔记--保存和恢复activity的状态数据

转android笔记--保存和恢复activity的状态数据

切换屏幕方向时保存和恢复 ButtonText

Activity 状态的保存和恢复