从AlarmManager中删除特定的警报

时间:2013-07-25 13:01:54

标签: android broadcastreceiver alarmmanager intentfilter

我想删除我在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 - 但我没有想法。你有吗?

1 个答案:

答案 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);