繁体   English   中英

Android,BroadCastReceiver中的onReceive被多次调用

[英]Android, onReceive in BroadCastReceiver is being called multiple times

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

从文档中。

如果指定的触发时间是过去的,则将立即触发警报,警报计数取决于过去触发时间相对于重复间隔的距离。

出于测试目的,更改public void setRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)将intervalMillis设置为5分钟或者其他内容,然后重复该操作。 你还应该收到一个以上的广播吗?

另外,从文档:

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM