【问题标题】:Android, onReceive in BroadCastReceiver is being called multiple timesAndroid,BroadCastReceiver 中的 onReceive 被多次调用
【发布时间】:2014-03-23 16:18:43
【问题描述】:

我对@9​​87654322@ 和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 秒。
  • 是的,我知道,我现在用 15 秒来测试它。但是每次计时器命中时,onReceive 方法都会被快速调用 3-5 次。
  • 也许您正在注册该广播作为多个实例?
  • 尝试如下设置你的闹钟,onReceive 不会被多次调用。 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 15000, 15000, pendingIntent);

标签: java android broadcastreceiver alarmmanager


【解决方案1】:

来自文档。

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

出于测试目的,将public void setRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) 设置intervalMillis 更改为5 分钟或其他值,然后重复该操作。如果您仍然收到多个广播,那就是另外一回事了。

另外,来自文档:

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

这意味着您应该在 PendingIntent 每次完成它需要做的事情时取消它,否则您可能会使用递归来设置操作,直到您完成它。要检查这一点,请运行您的代码几分钟,然后检查广播量是否增加。如果是这样,您将在最后一个警报完成之前启动一个新警报。

再一次,来自相同的文档:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多