我认为需要提及的requestCode参数。getBroadcast()
我同意根据给定的意图取消所有警报。但是在定义PendingIntent取消时,可以使用唯一的requestCode使警报唯一。因此,只有那些具有相同意图和requestCode的警报才会被取消:
int TIMER_1 = 1;
int TIMER_2 = 2;
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
Intent i = new Intent(this, AppReciever.class);
i.putExtra("timer", "one");
PendingIntent pending = PendingIntent.getBroadcast(this, TIMER_1, i,
PendingIntent.FLAG_CANCEL_CURRENT);
Calendar cal = Calendar.getInstance();
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pending);
然后根据此检查 PendingIntent 是否存在:
PendingIntent pending1 = PendingIntent.getBroadcast(this, TIMER_2, i,
PendingIntent.FLAG_NO_CREATE);
boolean alarmUp = (pending1 != null);
alarmUp
将是错误的(注意 FLAG_NO_CREATE 用于不创建新的,如果不存在)所以尝试使用相同的requestCode:
PendingIntent pending2 = PendingIntent.getBroadcast(this, TIMER_1, i,
PendingIntent.FLAG_NO_CREATE);
alarmUp = (pending2 != null);
alarmUp
将是真的,现在尝试新的意图包含不同的额外内容:
Intent i2 = new Intent(this, AppReciever.class);
i2.putExtra("timer", "two");
pending2 = PendingIntent.getBroadcast(this, TIMER_1, i2,
PendingIntent.FLAG_NO_CREATE);
alarmUp = (pending2 != null);
alarmUp
也将是正确的,因为i
andi2
是相同的,尽管额外的不是,所以现在您可以删除此警报:
am.cancel(pending2);