首页 > 解决方案 > 正确覆盖 onStop() 和 onRestart() 调用,但不会执行以下代码

问题描述

我目前正在 Android Studio 中开发一款结合了 Java 和 Android 的游戏。

我的问题:当我关闭应用程序时,等待几秒钟并返回应用程序,它仍然在后台运行。这会导致游戏对象继续移动,这显然总是导致游戏结束。

我在我的游戏中实现了一个“暂停”函数/方法,可以通过暂停按钮访问,但在我关闭应用程序时也应该调用它。这应该会在我关闭应用程序时暂停游戏,并在我返回应用程序时暂停。

我还实现了一个“恢复”函数/方法来退出暂停屏幕,当我重新进入我的应用程序时也应该调用它。

当我的活动引发 onStop() 和 onRestart() 方法时,“public void pause()”和“public void resume()”这两种方法都会被正确调用,但它们不会像通过暂停按钮调用时通常所做的那样。

我用一个简单的 System.out.println(""); 这向我表明,当我关闭或重新进入我的应用程序时,我的 pause() 和 resume() 方法会被调用。但他们实际上并没有做他们背后的逻辑(暂停游戏)

我的 MainActivity 类

public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

scene = new GameplayScene();

@Override
    protected void onStop() {
        super.onStop();
        scene.pause(); //
        System.out.println("stopped"); //testing purposes
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        scene.resume();
        System.out.println("restarted"); //testing purposes
    }
}

还有我的 GamePlayScene 类

public void pause() {
        System.out.println("Pause Method Called");//works
        paused = true;
        timeScale = 0; //this freeze all movement (game pause)

        pauseImg = bf.decodeResource(Constants.CURRENT_CONTEXT.getResources(), R.drawable.resumesymbol);
    }

    public void resume() {
        System.out.println("Resume Method Called");
        paused = false;
        timeScale = 1; //this unlocks every movement again (game resume)
        touchable = true;

        pauseImg = bf.decodeResource(Constants.CURRENT_CONTEXT.getResources(), R.drawable.pausesymbol);
    }

正如我所说:每个必要的方法都被正确调用。

I/System.out:暂停方法调用 I/System.out:停止

I/System.out:恢复方法调用 I/System.out:重新启动

为什么它实际上并没有暂停游戏,而是继续移动对象?

编辑:

我的按钮只是一个矩形,100x100 像素,浮动在右上角。按钮通过 pausebutton.png 的位图显示,我检查按钮是否已被以下内容按下:

public void pause(float touchX, float touchY) {
        if (pauseRect.contains((int)touchX,(int) touchY)) {
            paused = true;
            timeScale = 0;

            pauseImg = bf.decodeResource(Constants.CURRENT_CONTEXT.getResources(), R.drawable.resumesymbol);
        }
    }

这是按钮的暂停方法。用户在物理按钮上调用此方法 - 您在上面看到的另一个暂停方法应该通过关闭应用程序来调用(它工作得非常好,但在它关闭的那一刻它不会在方法中执行其他操作)

该方法的详细作用:设置布尔值 paused = true; 设置 int timeScale = 0

gameloop 总是在我的播放器类的每一帧上调用 update(),在这个 update() 方法中,它设置速度 * timeScale,导致在 timeScale = 0 时停止运动。

这一切都适用于我的暂停按钮,但不适用于 onRestart()

标签: javaandroidandroid-activity

解决方案


推荐阅读