我想删除我在Broadcastreceiver中设置的闹钟。 这就是它应该如何执行:
我收到一条GCM消息,其中包含user_state字段。
if user_state is 0 no notification is triggered if user_state is 1 a notification is triggered if user_state is 2 an Alarm is set and the notification is triggered 20 Minutes later.
这一切都运作良好。
现在我想删除一个特定的警报,具体取决于从GCM-intent收到的数据。 不幸的是,AlarmManager.cancel()不会比较Extra字段。 我也尝试使用intent.setType(“要比较的数据”),但如果我设置此字段,则不会收到广播......
我现在尝试使用Data注册一个新的BroadcastReceiver,它应该在Action字段中进行比较。 据我所知,这应该可以正常工作,但是无法在BroadcastReceiver中注册BroadcastReceiver。
此外,无法从AlarmManager获取Pendingintents列表。 所以我现在所能做的就是删除所有警报 - 这不是一个选项,
我唯一的另一个想法是使用我自己的服务而不是AlarmManager ...我想避免那个。当存在buildin选项时,我不想使用额外的资源。
这是我设置的警报方法:
private void setTimed(Intent intent, Notify notify) {
Bundle bundle = intent.getExtras();
bundle.remove("userstate");
bundle.putString("userstate", "3");
Intent ringintent = new Intent("de.pluetzner.waveobserver.TRECEIVE");
ringintent.setType(notify.getHost()+"&&&"+notify.getService());
ringintent.putExtras(bundle);
AlarmManager am = (AlarmManager) this.context.getSystemService(this.context.ALARM_SERVICE);
PendingIntent pi = PendingIntent.getBroadcast(this.context, 0, ringintent, 0);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (this.waittime * 60 * 1000), pi);
Log.d("timer", "time set");
}
ringintent.setType()应该是警报的标识符,但不起作用。 没有这个,就会收到警报
这是删除警报的方法。
private void deleteAlarm(Intent intent, Notify notify) {
Intent ringintent = new Intent("de.pluetzner.waveobserver.TRECEIVE");
ringintent.setType(notify.getHost() + "&&&" + notify.getService());
PendingIntent pi = PendingIntent.getBroadcast(this.context, 0, ringintent, 0);
AlarmManager am = (AlarmManager) this.context.getSystemService(this.context.ALARM_SERVICE);
am.cancel(pi);
Log.d("timer", "time removed");
}
这里也是一样 - 使用setType设置它不起作用。没有它,它会删除每个警报。
我也知道它会以某种方式滥用setType - 但我没有想法。你有吗?
答案 0 :(得分:1)
getBroadcast方法的RequestCode参数唯一标识每个PendingIntent。
您可以为每个PendingIntent分配唯一的整数代码。
闹1:
PendingIntent pi = PendingIntent.getBroadcast(this.context, 1, ringintent, 0);
闹2:
PendingIntent pi = PendingIntent.getBroadcast(this.context, 2, ringintent, 0);
现在,如果你想单独杀死Alarm2,重新创建具有相同标识符的PendingIntent,然后调用AlarmManager的cancel方法
PendingIntent sender = PendingIntent.getBroadcast(this, 2, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.cancel(sender);