在 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】:我认为您确实需要定位onSaveInstanceState
和onRestoreInstanceState
或使用onCreate
功能来执行此操作(onRestoreInstanceState
在onStart
之后调用,而onCreate
在onStart
之前调用- 所以你需要使用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