Android:使用SurfaceView重新获得焦点

我现在正在掌握Android,玩弄Lunar Lander样本。

我发现如果您离开应用程序(例如,点击通话按钮),它将破坏底层表面(调用surfaceDestroyed )。

向后导航(将触发onWindowVisibilityChanged )应用程序将崩溃,因为它将尝试绘制到曲面而不重新创建它。

是否有一些代码可以放在onWindowVisibilityChanged (或其他任何地方)上,这些代码将重新生成SurfaceView的底层表面并很好地恢复执行?

感觉这应该是一个简单的函数调用,但我在API文档中找不到任何东西。

谢谢!

这个“mSurfaceExists = true”的解决方案对我来说也不起作用。 看起来像surfaceCreated()没有被调用,因为没有调用super.onWindowVisibilityChanged()。 因此没有创建表面并且它不会崩溃因为没有调用threas.start。

我认为问题是:调用thread.start()会导致错误,因为线程已经启动。 但是在surfaceDestroyed()中,thread.join导致线程完成并死掉。 并且线程一旦死亡就无法重启。

我猜测的诀窍是在surfacecreated中创建一个新线程,或者只在用户调用应用程序完成(后退键)而不是暂停(home键)时才使线程完成。 这可以通过在活动上调用isFinishing()来检查。

不确定这是否有效。 我很快就会尝试这个。

误诊! 该应用程序会自动重新创建曲面,但是在那里有一个调用,它会在创建之前尝试绘制它。

解决问题:

 boolean mSurfaceExists; ... public void surfaceDestroyed(SurfaceHolder holder) { mSurfaceExists = false; ... } public void surfaceCreated(SurfaceHolder holder) { mSurfaceExists = true; ... } protected void onWindowVisibilityChanged(int visibility) { // only call base if there's a surface if(mSurfaceExists) super.onWindowVisibilityChanged(visibility); } 

现在一切都在膨胀。 (据我所知,无论如何 – 如果这是不好的做法,Java / Android专家可以随意评论!)