启用设备密码屏幕时游戏崩溃

问题描述:

使用Microsft Exchange时,Android会激活密码屏幕,用户需要在每次打开设备时都要通过密码屏幕。启用设备密码屏幕时游戏崩溃

我正在制作一个使用由线程运行的SurfaceView的游戏。我正在使用很多静态变量。如果设备在播放过程中被关闭,当我回来并输入密码时,游戏屏幕会显示一些位图大小不正确的图像并被冻结。

在日志中,我看到第一个NullPointerException与非UI线程,然后ANR错误。它看起来像关闭设备已经销毁了我的应用程序的一些对象,但它没有再次通过onCreate和SurfaceView构造函数。

当通过电话或单击HOME按钮暂停游戏时,我没有任何问题。另外在其他两种设备上,游戏在游戏中途关闭和打开后仍能正常工作,但它们没有安全屏幕。

我使用的Galaxy Tab,OS 2.2

编辑: 后在线程中打印堆栈跟踪,我得到

android.graphics.Canvas.throwIfRecycled

似乎我的一些位图已被回收。任何想法如何在onResume或surfaceChanged()中检测到这一点,它总是在返回到应用程序时触发?

+0

堆栈跟踪真的会有所帮助。您的游戏在通电时是否重新启动?你是否将任何数据保存到db/file/preferences? – 2011-04-12 15:35:28

+0

发布您在日志中获得的内容,以便我们找到某些内容 – 2011-04-12 15:37:45

目前,我对这个问题的解决方案是关闭这个活动,如果它没有恢复正确的事件序列。如果onSurfaceChanged发生而没有onSurfaceCreated先发生,则关闭此活动。游戏的状态仍然可以保留,当玩家重新开始这个活动时,它会继续停止。

@Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 

     //if it does not start through surfaceCreated close activity 
     // because some bitmaps could be recycled and crash the application 
     if (!surfaceCreatedFirst){ 
      _thread.setRunning(false); //stop the thread 
      ((Activity) context1).finish(); //close activity 
     } 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     surfaceCreatedFirst = true; 
     _thread = new FootballThread(holder, this); 
     _thread.setRunning(true); 
     _thread.start(); 
    }