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

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

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

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

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

【问题讨论】:

    标签: android android-activity


    【解决方案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 继承。
    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    相关资源
    最近更新 更多