当屏幕锁定和解锁时,游戏会冻结

时间:2014-03-06 16:24:22

标签: android sleep lockscreen

我刚写了一些小游戏,问题是,每次我在游戏过程中锁定屏幕并在此之后将其解锁,游戏会冻结。我不知道为什么会发生这种情况。

现在我想知道在屏幕被锁定时我需要更改哪种方法将游戏设置为暂停或恢复。

是否有像onScreenLocked()或onScreenWake()这样的方法?

我有三个课程, mainactivity ,为自己的视图添加了游戏视图。这个游戏视图得到了一个 gamethread ,它不断更新游戏视图本身。

现在当onPause()在mainactivity上被调用时,它会调用gameView.pause();方法

这是这个方法(gameview.pause()):

public void pause() {
    isPaused = true;
    gameThread.pause();
}

当isPaused = true时,游戏会不断更新。如果没有,那就没有了。

当mainActivity上的onResume()被调用时,gameView.resume();方法被调用,如下所示:

public void resume() {
    gameThread = new GameThread(this);
    gameThread.startThread();
            isPaused = false;
}

是的,就是这样。 现在,当在比赛期间按下主页按钮时,它会暂停,当重新进入游戏时,它会在最终结束时继续。

但是当按下锁定按钮并在此之后解锁屏幕时,我只看到游戏冻结,我不知道为什么。

我发现在解锁屏幕时游戏线程不再运行了。我不知道如何解决它,因为在添加一些

gameThread.start();

游戏会崩溃。 但是为什么游戏线程在锁定屏幕时停止工作,但是在离开游戏并重新进入游戏时工作得很好?

编辑:

我刚刚发现了我的问题。我的gameView代码看起来像这样:

public class GameView extends SurfaceView implements OnGestureListener{

public GameView(Context context, Activity activity) {
    super(context); 
    gameThread = new GameThread(this);
    init();
    holder = getHolder();
    holder.addCallback(new SurfaceHolder.Callback() {

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {

        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            gameThread.setRunning(true);
            gameThread.start();
        }

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

        }
    });
}


public void init() {
}


public void update() {

}

public void draw(Canvas canvas) {
    super.draw(canvas);

}


public void pause() {
    isPaused = true;
    gameThread.setRunning(false);
}

public void resume() {
    gameThread = new GameThread(this);
    gameThread.startThread();   

}


}

我发现了

public void surfaceCreated(SurfaceHolder holder) {
            gameThread.setRunning(true);
            gameThread.start();
        }

在按住主屏幕并重新进入游戏时,只需按住屏幕,但在锁定屏幕并再次解锁时。这就是线程无法启动的原因。

现在我想知道如何手动调用此方法?

1 个答案:

答案 0 :(得分:1)

您应该可以使用onPause()和onResume()。查看活动生命周期以获取更多信息。