为啥Android警报会同时触发?

Posted

技术标签:

【中文标题】为啥Android警报会同时触发?【英文标题】:Why do Android alarms fire at the same time?为什么Android警报会同时触发? 【发布时间】:2014-08-17 00:10:21 【问题描述】:

下面是一个非常简单的方法,它需要一个 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 两次 - 每个警报再次调用一次。救命!

【问题讨论】:

闹钟时间相差多远?默认情况下,Android 会批量发出警报以节省电池电量。 我已经看到警报相隔仅 2 分钟时会发生这种情况。 如果我还为每个警报指定一个唯一的过滤器,我发现它可以正常工作(两个警报都在正确的时间触发)。也就是说,我使用了“com.counter.app.CountActivity.COUNT”+ id 而不是“com.counter.app.CountActivity.COUNT”。我不敢相信这是正确的方法,但我想不出更好的选择。 对于那些因为犯了同样愚蠢的错误而偶然发现这一点的人,我的问题是我每次调用 setCountdownAlarm 时都注册了 BroadcastReceiver。 BroadcastReceiver 只能注册一次! 【参考方案1】:

我知道我做错了什么。如对类似问题的回答中所述,如果您想获得唯一的待处理意图,则 PendingIntent.getBroadcast (requestCode) 的第二个参数必须是唯一的。我通过传递“id”来解决这个问题。

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

【讨论】:

以上是关于为啥Android警报会同时触发?的主要内容,如果未能解决你的问题,请参考以下文章

在Android警报管理器中设置时间-立即触发警报[重复]

如果当天的闹钟时间已经过去,android会阻止立即触发闹钟服务

Android - 空闲时允许重复警报

Android - 位置警报

Android:为啥长按也会触发正常点击?

Android AlarmManager 在每个活动上触发