即使从其他活动取消,警报通知也会继续触发

时间:2018-03-10 17:51:12

标签: android notifications alarm

我从活动A设置了警报,然后在活动BI中可以删除并更新活动A中的警报设置。更新警报正在运行但删除没有,我已经尝试了一些答案,但似乎没有任何工作

我像这样设置警报。

public void Alarms() {
    for(eventlist_model model:arrayList)
    {
        int id=model.getEvent_id();
        String type=model.getEvent_type();
        String date=model.getEvent_date();
        String time=model.getEvent_time();
        String note=model.getEvent_note();
        SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd HH:mm");
        try{
            String sched=date+" "+time;
            Date newSched=format.parse(sched);
            Calendar calendar1 = Calendar.getInstance();
            calendar1.setTime(newSched);
            if (calendar1.before(calendar))
                calendar1.add(Calendar.DATE, 1);
            Intent intent = new Intent(this, events_receiver.class).setAction("Dog_alarm");
            intent.putExtra("type", type);
            intent.putExtra("note", note);
            intent.putExtra("id", id);
            PendingIntent dog1 = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            final AlarmManager alarm1 = (AlarmManager) getSystemService(ALARM_SERVICE);
            if (Build.VERSION.SDK_INT >= 19) {
                alarm1.setExact(AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(), dog1);
            } else {
                alarm1.set(AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(), dog1);
            }
        }catch (Exception e)
        {
            e.printStackTrace();
        }


        }

}

然后在活动B中我用它来取消闹钟

public void cancelTask()
{   int id=Integer.valueOf(eventid);
    Intent intent = new Intent(update_task.this, events_receiver.class);
    AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
    PendingIntent task = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarm.cancel(task);
}

但是它不起作用而且我被困在这里。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

根据AlarmManager的{​​{3}}方法的文档:

  

取消取消(PendingIntent操作)

     

删除具有匹配Intent的所有警报。任何类型的警报,   其Intent与此Intent匹配(由filterEquals(Intent)定义),   将被取消。

这意味着,如果intentA检测到与intentB相等,则使用filterEqauls方法,即intentA.filterEquals(intentB)==true,则可以使用intentB在alarmanger中取消已在alarmManager中设置的intentAcancel文档通知:

  

boolean filterEquals(Intent other)

     

为了意图的目的,确定两个意图是否相同   分辨率(过滤)。也就是说,如果他们的行动,数据,类型,类,   和类别是一样的。这不会比较任何额外的数据   包含在意图中。

这意味着filterEquals并不关心意图内部的额外内容来比较它们,但像Action这样的其他参数应该完全相同。 在您的情况下,您错过了取消意图中的setAction

因此,您应该像这样更改cancelTask方法:

public void cancelTask()
{   int id=Integer.valueOf(eventid);
    Intent intent = new Intent(update_task.this, events_receiver.class);
    intent.setAction("Dog_alarm");//<--- this is missed
    AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
    PendingIntent task = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarm.cancel(task);
}