代码之家  ›  专栏  ›  技术社区  ›  Deniro

即使从另一个活动中取消了报警通知,报警通知仍会持续触发

  •  0
  • Deniro  · 技术社区  · 7 年前

    我从活动A中设置了一个警报,然后在活动B中我可以删除并更新活动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 回复  |  直到 7 年前
        1
  •  0
  •   VSB    7 年前

    根据文件 cancel 方法 AlarmManager :

    作废取消(挂起内容操作)

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

    这意味着如果 intentA 检测到等于 intentB ,使用 filterEqauls 方法,即。 intentA.filterEquals(intentB)==true 然后 intentB公司 在alarmanger中可用于取消 意图 已在alarmManager中设置。 filterEquals 文件通知:

    布尔过滤器相等(其他意图)

    确定出于意图的目的,两个意图是否相同 分辨率(过滤)。也就是说,如果他们的操作、数据、类型、类, 和类别相同。这不会比较任何额外数据 包括在意向书中。

    这是真的 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);
    }