我有2个BroadcastReceivers和2个意图,我想点击一个按钮,5m后开始播放1和10m后开始播放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);
}
}
问题: 为什么最近的意图将之前的意图推到他的开始时间?
我通过打印广播代码执行的时间来确认此行为。请帮忙
答案 0 :(得分:1)
您看到的问题是repeating alarms now work的方式。为了保持电池寿命,AlarmManager
现在在重新安排警报时非常自由,以便将多个警报组合在一起。基本上,如果您需要任何准确的计时,您应该忘记使用setRepeating()
。请改用setExact()
。如果您需要重复闹钟,请在闹钟响起时将其重置。
答案 1 :(得分:0)
原因是,意图不是个体。当数据相同时(如在您的情况下),它们被重用
来自doc:
人们常犯的一个错误就是使用Intent创建多个PendingIntent对象,这些Intent只会在" extra"内容,期望每次获得不同的PendingIntent。这不会发生。用于匹配的Intent部分与Intent.filterEquals定义的部分相同。如果你使用两个与Intent.filterEquals相同的Intent对象,那么你将获得两个相同的PendingIntent。
答案 2 :(得分:-1)
您requestCode
电话中的getBroadcast
字段似乎并不总是让它独一无二。请参阅此问题的第二条评论:
What's "requestCode" used for on PendingIntent?
由于“额外”内容也没有区分它们,有人发现在Intent上设置不同的数据有效: https://stackoverflow.com/a/33203752/508608