为啥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警报会同时触发?的主要内容,如果未能解决你的问题,请参考以下文章