Java Android,BroadCastReceiver中的onReceive被多次调用
我有一个关于Java Android,BroadCastReceiver中的onReceive被多次调用,java,android,broadcastreceiver,alarmmanager,Java,Android,Broadcastreceiver,Alarmmanager,我有一个关于AlarmManager和BroadcastReceiver的问题 我想使用AlarmManager每隔15分钟更新一次数据(代码中不是这种情况,因为我仍在尝试让功能正常工作),但发生了一些我不太理解的事情 每当计时器调用onReceive方法时,它一次被快速调用3-5次,LogCat消息被写入3-5次。我的代码有问题吗 代码: MainActivity类中的方法: private void setCloseByChecker() { AlarmManager alarmM
AlarmManager
和BroadcastReceiver
的问题
我想使用AlarmManager
每隔15分钟更新一次数据(代码中不是这种情况,因为我仍在尝试让功能正常工作),但发生了一些我不太理解的事情
每当计时器调用onReceive
方法时,它一次被快速调用3-5次,LogCat
消息被写入3-5次。我的代码有问题吗
代码:
MainActivity
类中的方法:
private void setCloseByChecker() {
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar cal=Calendar.getInstance();
Intent intent = new Intent(this, CloseByReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
this.getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
cal.getTimeInMillis() + 15000, 15000, pendingIntent);
}
@Override
public void onReceive(Context context, Intent intent) {
Log.i("hello","hello");
}
以及广播接收器
类:
private void setCloseByChecker() {
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar cal=Calendar.getInstance();
Intent intent = new Intent(this, CloseByReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
this.getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
cal.getTimeInMillis() + 15000, 15000, pendingIntent);
}
@Override
public void onReceive(Context context, Intent intent) {
Log.i("hello","hello");
}
你是想取消吗? 请记住,每次使用不同ID(第二个参数)调用
setRepeating()
,都会复制报警
尝试通过调用alarmManager来取消所有报警。从文档中取消(PendingEvent) 如果规定的触发时间在过去,则会立即触发报警,报警计数取决于触发时间过去与重复间隔之间的距离 出于测试目的,将
public void setRepeating(int-type,long triggerAtMillis,long intervalMillis,pendingent操作)
将intervalMillis设置为5分钟左右,然后重复该操作。如果你仍然收到不止一个广播,那是另外一回事
此外,从文件中:
此警报将继续重复,直到使用“取消”(PendingEvent)明确删除
这意味着您应该在PendingEvent每次完成所需操作时取消它,否则您可能会使用递归来设置操作,直到完成为止。要检查这一点,请运行代码几分钟,然后检查广播数量是否增加。如果是,则在上一个警报完成之前,您正在启动一个新警报
同样,根据相同的文档:
如果您的应用程序希望允许传递时间漂移,以确保报警之间至少有一定的时间间隔,那么采取的方法是使用一次性报警,在处理每个报警传递时自己安排下一个报警
时间以毫秒表示,15000毫秒实际上是15秒。是的,我知道,我现在用15秒来测试它。但每次计时器点击onReceive方法时,都会被快速调用3-5次。我有这个问题。也许你正在注册该广播作为多个实例?请尝试按如下方式设置闹钟,
onReceive
不会被多次调用<代码>alarmManager.setRepeating(alarmManager.RTC_唤醒,System.currentTimeMillis()+15000,15000,PendingEvent)代码>