奇怪的AlarmManager行为

我有2个BroadcastReceivers和2个意图,我想点击一个按钮,5米后开始播放1和10米后开始播放2,发生的事情是他们都在我点击后10米开始,我的猜测是,意图不是唯一的,但我是为每个人设置不同的reqeustCode。

按钮的OnClick:

Bundle bd = new Bundle(); bd.putInt("mInt", i); Intent intent1 = new Intent(getActivity(), Broadcast_1.class); intent1.putExtras(bd); PendingIntent pendingIntent1 = PendingIntent.getBroadcast(getActivity().getApplicationContext(), i, intent1, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager1 = (AlarmManager) getActivity().getApplicationContext().getSystemService(Context.ALARM_SERVICE); alarmManager1.setRepeating(AlarmManager.RTC, System.currentTimeMillis()+1000*60*5, 1000*60*10, pendingIntent1); Toast.makeText(getActivity(), "countdown started "+i ,Toast.LENGTH_SHORT).show(); Intent intent2 = new Intent(getActivity(), Broadcast_1.class); intent2.putExtras(bd); PendingIntent pendingIntent2 = PendingIntent.getBroadcast(getActivity().getApplicationContext(), i+42212342, intent2, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager2 = (AlarmManager) getActivity().getApplicationContext().getSystemService(Context.ALARM_SERVICE); alarmManager2.setRepeating(AlarmManager.RTC, System.currentTimeMillis()+1000*60*10, 1000*60*10, pendingIntent2); 

BroadcastReceiver_1和_2(它们看起来一样)类:

 public class Broadcast_1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Calendar c = Calendar.getInstance(); int seconds = c.get(Calendar.SECOND); int minutes = c.get(Calendar.MINUTE); ShowTextFragment.setText("Broadcast_1" + " at " + minutes + " : " + seconds); } } 

问题:为什么最近的意图将之前的意图推到他的开始时间?

我通过打印广播代码执行的时间来确认此行为。 请帮忙

您看到的问题是重复警报现在的工作方式 。 为了保持电池寿命, AlarmManager现在在重新安排警报时非常自由,以便将多个警报组合在一起。 基本上,如果您需要任何类型的精确计时,您应该忘记使用setRepeating() 。 请改用setExact() 。 如果您需要重复闹钟,请在闹钟响起时将其重置。

原因是,意图不是个体。 当数据相同时(例如您的情况),它们会被重用

从文档 :

人们常犯的一个错误是使用Intents创建多个PendingIntent对象,这些对象只在“额外”内容中有所不同,期望每次都获得不同的PendingIntent。 这不会发生。 用于匹配的Intent部分与Intent.filterEquals定义的部分相同。 如果你使用两个与Intent.filterEquals等效的Intent对象,那么你将获得两个相同的PendingIntent。

似乎getBroadcast调用中的requestCode字段并不总是使其唯一。 请参阅关于此问题的第二条评论: PendingIntent上使用了什么“requestCode”?

由于“额外”内容也没有区分它们,有人发现在Intent上设置不同的数据有效: https : //stackoverflow.com/a/33203752/508608