Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android,BroadCastReceiver中的onReceive被多次调用_Java_Android_Broadcastreceiver_Alarmmanager - Fatal编程技术网

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)