Android中,BroadCastReceiver中的onReceive方法被多次调用了。

7
我有一个关于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);       
}

BroadcastReceiver类:

@Override
public void onReceive(Context context, Intent intent) {     

    Log.i("hello","hello");
}

时间以毫秒表示,15000毫秒实际上是15秒。 - GionJh
是的,我知道,我现在只用了15秒来测试它。但每次计时器触发onReceive方法时,都会被快速调用3-5次。 - user3423108
我有这个问题..http://stackoverflow.com/questions/22849474/alarm-expires-earlier-than-intended-when-using-setinexactrepeating - NitZRobotKoder
你可能正在多个实例中注册该广播? - Tharaka Devinda
尝试按照以下方式设置您的闹钟,onReceive 将不会被多次调用。alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 15000, 15000, pendingIntent); - zeeali
2个回答

1
从文档中得知,如果规定的触发时间已经过去,将立即触发警报,警报计数取决于触发时间相对于重复间隔的过去时间。为了测试目的,将intervalMillis设置为5分钟或其他值,然后重复操作。如果仍然接收到多个广播,则是其他问题。此外,文档中还指出,该警报会一直重复,直到使用cancel(PendingIntent)明确删除为止。这意味着在完成所需的操作后应每次取消PendingIntent,否则您可能会使用递归来设置操作,直到完成为止。要检查,请运行代码几分钟,然后检查广播数量是否增加。如果增加了,则是在上一个警报完成之前启动了新的警报。文档中还有这样一句话:
如果您的应用程序希望允许交付时间漂移,以保证至少在警报之间始终经过一定的时间间隔,则采取的方法是使用一次性警报,在处理每个警报交付时自己安排下一个警报。

0

你有取消它们的方式吗? 请记住,每次使用不同的ID(第二个参数)调用setRepeating()时,都会复制您的闹钟。

尝试通过调用alarmManager.cancel(pendingIntent)取消所有闹钟。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接