Android,BroadCastReceiver中的onReceive被多次调用

时间:2014-03-23 16:18:44

标签: java android broadcastreceiver alarmmanager

我对AlarmManagerBroadcastReceiver

有疑问

我想使用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");
}

2 个答案:

答案 0 :(得分:1)

来自文档。

  

如果规定的触发时间是过去的,则会立即触发警报,警报计数取决于触发时间相对于重复间隔的过去程度。

出于测试目的,将public void setRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)设置的intervalMillis更改为5分钟或其他内容,然后重复操作。如果你仍然收到一个以上的广播,那就是别的了。

另外,来自文档:

  

此警报会继续重复,直到使用cancel(PendingIntent)明确删除。

这意味着每次完成它需要做的事情都应该取消PendingIntent,否则你可能会使用递归来设置操作,直到你完成它为止。要检查这一点,请运行代码几分钟,然后检查BroadCast ammount是否已增加。如果是,则在最后一个完成之前开始新的警报。

然后,再次,从相同的文档:

  

如果您的应用程序希望允许交付时间漂移以确保警报之间始终至少经过一定的时间间隔,那么采取的方法是使用一次性警报,在处理时自行安排下一个警报每次报警发送。

答案 1 :(得分:0)

你是否以某种方式取消了它们? 请记住,每次使用不同的ID(第二个参数)拨打setRepeating()时,您都会复制警报。

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