Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在活动停止和恢复时保存SurfaceView的状态_Android_Android Activity - Fatal编程技术网

Android 在活动停止和恢复时保存SurfaceView的状态

Android 在活动停止和恢复时保存SurfaceView的状态,android,android-activity,Android,Android Activity,我有一个由游戏引擎(线程)管理的SurfaceView活动。我正在重写onCreate和onSaveInstanceState以管理线程的保存/还原状态 当从该活动的菜单访问preferences(首选项)屏幕时,该活动将通过其生命周期进入顶部;当首选项屏幕关闭时,活动将在onResume再次启动,因此onCreate不会发生。但是,线程处于终止状态,因此无法恢复 是的,我可以创建一个线程的新实例——但是如何恢复状态呢?我也尝试过重写onRestoreInstanceState,但经过快速测试和

我有一个由游戏引擎(线程)管理的SurfaceView活动。我正在重写onCreate和onSaveInstanceState以管理线程的保存/还原状态

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

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


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

我认为您确实需要针对
onSaveInstanceState
onRestoreInstanceState
或使用
onCreate
功能来完成此操作(
onrestoreinnstancestate
onStart
之后调用,而
onCreate
onStart
之前调用-因此,您需要使用
onCreate
的操作方法,尽管我将在下面列出这两种方法)

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

protected void onSaveInstanceState(Bundle outState) {
  outState.putInt(YourSurfaceViewClass.SOME_ID, surfaceViewClass.getVar());
  super.onSaveInstanceState(saveBundle);
}
并在创建时恢复
中的值:

public void onCreate(Bundle savedInstanceState) {
  if (savedInstanceState != null){
    value = savedInstanceState.getInt(YourSurfaceViewClass.SOME_ID);
  }
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    value = savedInstanceState.getInt(YourSurfaceViewClass.SOME_ID);
}
恢复安装状态

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

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

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

如果
被终止
,我可以创建一个
捆绑包
,并将其传递给我引擎的saveState方法。一旦有了状态,我会将线程设置为一个新的游戏引擎线程,并传递最近保存的
捆绑包
。我认为继续正常(启动线程)


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

谢谢你的回答。我已经尝试过了,正如我之前提到的在本例中,不会调用我的post.onCreate,onRestoreInstanceState也不会被调用[因为它直接转到onResume]。您的问题中没有提到游戏引擎!您的问题是一个一般性问题,但您是在特殊情况下解决的。这里的问题是线程,而不是游戏引擎实现;我在本例中提出的解决方案是在实现任何正在管理的游戏引擎实现时,不要继承
线程国家。