正常使用的代码是这样的:
private void createAlarm(String message, int hour, int minutes){
AlarmManager alarmManager = (AlarmManager)
getSystemService(Service.ALARM_SERVICE);
//设置定时发送广播的PendingIntent
Intent intent = new Intent(this, ClockReceiver.class);
Bundle bundle = new Bundle();
bundle.putString("text",message);
intent.putExtras(bundle);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);
//设置当前时间
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());
// 根据用户选择的时间来设置Calendar对象
c.set(Calendar.HOUR_OF_DAY, hour);
c.set(Calendar.MINUTE, minutes);
c.set(Calendar.SECOND,0);
c.set(Calendar.MILLISECOND, 0);
// 设置AlarmManager在Calendar对应的时间发送广播
alarmManager.cancel(pi);
alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);
}
这样使用是没毛病的。
但是问题在于,你 接连 定时两个广播发送的话。就是两个广播的发送时间间距较短。问题就出现。
尽管你给定时器设置了新的 PendingIntent ,然而它只会以你 第一次 设置的 PendingIntent 来发送广播。
- 拿我上面的代码做例子。
我两次传入不同的 message 来调用 createAlarm()。如果设置的两次定时的时间间隔较短。那么我的广播会两次拿到第一个 message。
解决方法
在于这一行代码
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);
需要注意这里的 PendingIntent.getBroadcast() 第二个参数requestCode,和第四个参数 flag。
- 可以通过传参不同的 requestCode 使系统识别这是两个不同 PendingIntent。
- 也可以通过修改flag为 FLAG_CANCEL_CURRENT 。flag常用值:
FLAG_ONE_SHOT:获取的PendingIntent只能使用一次。
FLAG_CANCEL_CURRENT:如果描述的PendingIntent已经存在,那么新的Intent之前会取代掉当前的。
FLAG_UPDATE_CURRENT:能够新new一个 Intent