为什么Android警报会同时触发?

时间:2014-08-17 00:10:22

标签: java android timer alarm

下面是一个非常简单的方法,它会触发一个Date和一个id来触发警报,从而开始倒计时。出于某种原因,我不明白,如果我用一个日期和id 0调用一次并再次使用另一个日期和id 1(即两个不同的倒计时)再次调用它,Android将同时触发两个警报(特别是id为0的第一个日期,所以两个倒计时同时开始。

谁能告诉我为什么以及如何解决这个问题?谢谢!

public void setCountdownAlarm(Date fireTime, int id)
{
    // startCountdown will be called at fireTime
    BroadcastReceiver startCountdown = new BroadcastReceiver() {
        @Override public void onReceive( Context context, Intent theIntent )
        {
            countdownTimer = new Timer();
            countdownTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    onSecondTick(showtime);
                }
            }, 0, 100); // call every 10th of a second
        }
    };

    this.registerReceiver( startCountdown, new IntentFilter("com.counter.app.CountActivity.COUNT") );
    Intent intent = new Intent("com.counter.app.CountActivity.COUNT");
    PendingIntent pintent = PendingIntent.getBroadcast( this, id, intent, 0 );
    AlarmManager manager = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE ));

    if (Build.VERSION.SDK_INT >= 19)
        manager.setExact(AlarmManager.RTC_WAKEUP, fireTime.getTime(), pintent);
    else
        manager.set(AlarmManager.RTC_WAKEUP, fireTime.getTime(), pintent);
}

编辑说当我等待第二个警报触发时,Android实际上两次调用startCountdown - 再次为每个警报调用。救命啊!

1 个答案:

答案 0 :(得分:1)

我弄清楚我做错了什么。如在类似问题的答案中所解释的,如果您想获得唯一的待定意图,则PendingIntent.getBroadcast(requestCode)的第二个参数必须是唯一的。我通过传递" id"来处理这个问题。

第二个问题是我每次调用setCountdownAlarm时都注册了BroadcastReceiver。 BroadcastReceiver只应注册一次,通常在活动的onCreate方法中注册。