我是整个Android环境中的新手,我常常有些疑惑,也许你可以考虑非常基本的知识,有点愚蠢。我会尽力解释我的疑问,以及为什么我要让它理解。
我正在做一个应用程序,你可以设置通知来提醒你想要的学者课程。我已经完成了一个扩展BroadcastReceiver的类,因此它可以在设备启动后重置所有警报。我有一个数据库,我可以保存有关警报的信息:类,必须配置的时间等。我检索所有警报并以这种方式将它们设置为alarmManager:
intent = new Intent(ctxt.getApplicationContext(), Notificacion.class);
intent.putExtra("TAG", tag);
intent.putExtra("SUBJECT", cursor2.getString(0));
intent.putExtra("AULA", cursor2.getString(1));
displayIntent = PendingIntent.getBroadcast(ctxt, Integer.parseInt(tag), intent, PendingIntent.FLAG_UPDATE_CURRENT );
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY*7, displayIntent);
嗯,我想这应该可以正常工作,直到这里。问题是,当您使用应用程序并且想要设置通知时,您正在从“Schedule.class”类中执行此操作,因此意图将具有此上下文:
Intent intent = new Intent(getApplicationContext(), Notification.class);
PendingIntent pend = PendingIntent.getBroadcast(this, Integer.parseInt(tag), intent, PendingIntent.FLAG_UPDATE_CURRENT);
在应用程序中,您可以删除警报,并且必须调用alarmManager.cancel(pend)才能执行此操作。所以我怀疑是否可以取消它。
如果上下文不同,它将找不到与待定意图的匹配,因为它是根据我在BroadCastReceiver(ctxt)扩展中获得的上下文设置的,并且警报是根据我从中获取的上下文设置的Schedule.class。
那么..应用程序上下文总是一样的吗?我知道设置上下文是为了向其他类提供有关已经发生的事情的信息,但我不确定Intent过滤器是否会区分上下文的位置。
提前谢谢!
答案 0 :(得分:2)
查看您正在使用的取消方法的AlarmManager文档:
public void cancel (PendingIntent operation)
在API级别1中添加
删除具有匹配Intent的所有警报。任何 任何类型的警报,其意图与此匹配(由...定义) filterEquals(Intent)),将被取消。
因此,Intent.filterEquals文档说明如下:
public boolean filterEquals (Intent other)
在API级别1中添加
确定两个意图是否相同 意图解决(过滤)的目的。也就是说,如果他们采取行动, 数据,类型,类和类别相同。这没有比较 意图中包含的任何额外数据。
我想不出为什么动作,数据,类型,类或类别会从一个明确的意图与另一个明显的意图不同的任何原因(除非显然你不顾一切地改变这些事情)。上下文似乎不符合匹配的标准,因此我认为无论在哪个上下文用于创建匹配的情况下,您都可以相信它会被取消。