【问题标题】:How to cancel AlarmManager using PendingIntents in different classes?如何在不同的类中使用 PendingIntents 取消 AlarmManager?
【发布时间】:2015-08-26 12:44:38
【问题描述】:

我正在尝试使用 AlarmManager 在我设置的闹钟时间执行一些任务。 我知道我必须使用相同的 PendingIntent 来制作和取消警报。 但是,问题是我在“ClassA”类中发出警报,然后在“ClassB”类中取消警报。

这就是为什么我想知道在每个类中广播的意图是否相同,因为它们使用“不同的上下文”,因为它们在不同的类中,我猜。

它们可以被视为相同的 PendingIntent 并且我可以取消警报吗? 如果不是,我怎样才能使它们相同?

用于在“ClassA”类(扩展广播接收器)中发出警报:

alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, myReceiver.class);
PendingIntent pender = PendingIntent.getBroadcast(context, codeNum, intent, 0);
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                    AlarmManager.INTERVAL_DAY, pender);

用于取消“ClassB”类(扩展 BaseAdapter)中的警报:

alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, myReceiver.class);
PendingIntent pilocal = PendingIntent.getBroadcast(context, codeNum, intent, 0);
pilocal.cancel();
alarm.cancel(pilocal);

【问题讨论】:

  • PendingIntent 实现 Parcelable,因此您可以在活动之间传递它。你试过吗?
  • @Abdullah 我不能通过它,因为这两个类不相关并且它们与时间无关。这就是我尝试使用相同的请求代码声明新 Intent 和 PendingIntent 的原因。

标签: android alarmmanager android-pendingintent


【解决方案1】:

您可以通过提供相同的操作、相同的 Intent 操作、数据、类别和组件以及相同的标志来检索相同类型的 PendingIntent。 是的,如果警报仍然有效,您可以取消其他课程的警报。只需确保您传递使用的相同参数,即用于创建待处理意图的请求代码。

【讨论】:

  • 您的问题是:它们可以被视为相同的 PendingIntent 并且我可以取消警报吗?如果没有,我怎样才能使它们相同?是的,它们可以被视为相同的 PendingIntent 并且是的,如果待定意图仍然有效,您可以从另一个类取消警报。
  • 您的意思是它们可以是“相同的”PendingIntents,即使它们在 Intent 中使用不同的上下文?因为你说它必须是相同的 Intent,但是,它不是相同的 Intent 动作,因为每个 Intent 中的上下文是不同的,我猜。
  • 我还有一个问题。如果我在创建警报时在意图中添加了额外的字符串,在取消警报时是否还必须在意图中添加额外的字符串(尽管它是不必要的)以使它们与 PendingIntent 相同?
  • 没有。为此目的比较 Intents 时忽略“附加”。要取消闹钟,您不需要任何“额外”。
猜你喜欢
  • 1970-01-01
  • 2022-11-05
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多