Android - 如何正确调用 onDraw(Canvas) 中的 intent(activity)?

Android - How to call an intent(activity) inside the onDraw(Canvas) properly?

我正在尝试调用 canvas 中的意图,但它似乎没有按照我认为的方式工作。我的想法是当它通过 startactivity() 时,就是这样,它立即退出 canvas 但我错了。

流量应该是:

Menu -> Pong(Activity) -> Canvas -> Game_Over

发生了什么:

Menu -> Pong(Activity) -> Canvas(screen stuck here) -> Game_Over(iterates unknown times)

有时会崩溃,无法继续Game_Over。

在我的 onDraw() 中是下面的代码,当满足 游戏结束条件 时:

Intent i = new Intent(getContext(), GameOver.class);
i.putExtra("score", Integer.toString(ball.getScore()));
i.putExtra("level", Integer.toString(ball.getLevel()));
getContext().startActivity(i);

根据我在制作分数后观察到的情况,它似乎循环了 20 多次,因为在下一个 activity 中找到的 "High Score" 的祝酒词不会停止并且屏幕停留在 canvas 直到循环停止。这给了我一个线索,要调用的 activity 循环了无数次。

谁对谁错?即使它已经启动了 startActivity(),它是否是用于重绘的 onDraw()?如果是,我如何在达到意图之前停止 onDraw() 循环,这样它就不会循环下一个 activity?

这是我的 onDraw():

public void onDraw(Canvas canvas) {
    // Background
    canvas.drawColor(Color.DKGRAY);

    // Score
    canvas.drawText("Score: " + Integer.toString(ball.getScore()), 25, 50,
            paint);

    // Level
    canvas.drawText("Level: " + Integer.toString(ball.getLevel()), 25, 100,
            paint);

    // =========================
    // Draw Paddle
    // paint.setColor(Color.parseColor("#AA00FFFF"));
    paint.setColor(Color.argb(170, 0, 255, 255));
    paint.setStrokeWidth(20);
    canvas.drawLine(padX, padY, padX + padWidth, padY, paint);

    // Draw Ball
    canvas.drawCircle(ball.getX(), ball.getY(), BALL_RADIUS, paint);

    if (ball.getScore() % 200 == 0) {
        // counter = counter + 1;
        if (ball.getLevel() < MAX_LEVEL) {
            ball.setSpeedX(ball.getSpeedX() * 0.25f);
            ball.setSpeedY(ball.getSpeedY() * 0.25f);
        }
    }

    postInvalidate();

    if (ball.getY() + (float) BALL_RADIUS >= y - 6) {
        if (ball.getX() + BALL_RADIUS / 2 > padX
                && ball.getX() - BALL_RADIUS / 2 < padX + padWidth) {
            ball.setGameOver(false);
        }

        else {
            ball.setGameOver(true);
            canvas.drawText("Game Over! Please Wait.", x / 2 - 170, y / 3,
                    paint);

            Intent i = new Intent(getContext(), GameOver.class);
            i.putExtra("score", Integer.toString(ball.getScore()));
            i.putExtra("level", Integer.toString(ball.getLevel()));
            getContext().startActivity(i);
        }

    }
}

onDraw 每秒可以调用 60 次,它应该只是绘制,而不是处理 activity 流程。 最小的变化是添加一个布尔值并确保只调用 startActivity 一次。更好的解决方案是将 activity 管理人员移出绘图,并移入状态管理逻辑