即使用户切换应用程序,CountDownTimer也会运行

时间:2016-01-11 20:15:59

标签: java android android-service countdowntimer

我正在构建Android游戏,我需要显示倒计时。为了让用户不作弊我无法在用户更改应用时停止此倒计时,因为他们会有更多时间来思考答案。

我需要做的是让CountDownTimer继续工作,即使我的应用程序当前不在前面(已调用onPause)。

我想知道我所拥有的代码(似乎有效)是否可以解决问题,或者在某些情况下它会失败。

现在倒计时继续,当它变为0时,结果屏幕显示在当前应用程序上(当然,这不是我想要的)。 我认为对于第二个问题,解决方案是存储变量或其他内容,并在启动结果屏幕之前检查它。

所以,总而言之,我想要的是即使用户更改当前应用程序也要继续倒计时,但当倒计时到0时,在用户返回游戏之前不要显示结果屏幕。 / p>

我的代码如下:

new CountDownTimer(10000, 1000) {

   public void onTick(long millisUntilFinished) {
       tvTime.setText(String.valueOf(millisUntilFinished / 1000));
   }

   public void onFinish() {
       startActivity(new Intent(GameActivity.this, ResultActivity.class));
   }
}.start();

谢谢。

3 个答案:

答案 0 :(得分:0)

将它存储在一个变量中,只要它没有暂停就显示它似乎是最简单的解决方案。我要做的是在onPause方法中将一些全局变量设置为true,类似

if(!thatGlobalVariable)
{
     displayVariable()
}

你知道我的意思,这是你的想法转发给你。

对不起,这没有多大帮助,你可能正在寻找其他更奢侈的解决方案。我会在此期间执行此操作,直到您得到更合适的答案。

此外,我认为如果在最小化时弹出超时消息,那将非常酷。所以这个人可能会在谷歌中查找某些东西然后突然“时间到了,你失败了”。人们喜欢那些折磨他们玩游戏的游戏。

答案 1 :(得分:0)

只是为了让您了解应该做些什么。可能应该使用SystemClock.elapsedTime()

public class CountdownTimer {
    private final long startTime = currentTime();
    private final long totalTime;
    private boolean isFinished = false;

    public CountdownTimer(long millis) {
        totalTime = millis;
    }

    public long timeLeft() {
        return totalTime - (currentTime() - startTime);
    }

    public boolean isFinished() {
        return isFinished || (isFinished = timeLeft() < 0);
    }

    protected long currentTime() {
        return System.currentTimeMillis();
    }
}

如果用户关闭了您的应用,那么您不应该在其上重新打开它。让他们自己打开应用程序,发现他们的时间已到,或者显示通知。

答案 2 :(得分:0)

除了您在SavedInstance中保存的所有其他游戏状态外,您还可以节省当前时间。当用户恢复您的应用时,您可以将新时间与保存的值进行比较,以确定时间是否已到。然后可以显示该消息。