Android:取消其他活动的警报集

时间:2011-08-15 03:10:58

标签: android alarmmanager

我会尽力解释这个问题。基本上,我有Activity 1使用ExternalClass做各种事情。活动2还引用了活动1的所述ExternalClass的对象。通过这两个活动,我可以使用AlarmManager设置警报,但我希望能够取消从活动1中的任一活动创建的所有警报。

使用相同的意图和相同的AlarmManger(都在ExternalClass中创建)设置所有警报,但是当我单击活动1中我应该调用myAlarms.cancel(intent)的按钮时,它仅取消警报使用Activity 1类创建。

通过引用在活动1中创建的该类的对象,在活动2中引用了ExternalClass,因此它们都应该使用相同的ExternalClass实例。由于设置警报时使用的上下文,我很确定它不会取消警报,但我无法弄清楚如何解决这个问题。

2 个答案:

答案 0 :(得分:5)

为了解决这个问题,我曾经使用过以下代码:

timerAlarmIntent = PendingIntent.getBroadcast(myContext, i, alarmIntent, 0);
ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();
intentArray.add(timerAlarmIntent);
myAM.set(AlarmManager.RTC_WAKEUP, alarmTime, timerAlarmIntent);

我将requestCode设置为唯一ID。这是在for循环中,我代表0,1,2 ......

要取消闹钟,我必须将每个闹钟添加到列表中,并在我想取消所有闹钟时循环显示列表。

private void cancelAlarms(){
if(intentArray.size()>0){
    for(int i=0; i<intentArray.size(); i++){
        myAM.cancel(intentArray.get(i));
    }
    intentArray.clear();
}

}

答案 1 :(得分:2)

要取消和闹钟,您需要将等效的PendingIntent(意味着p1.equals(p2)返回true)传递给用于创建它的人。从您创建AlarmManager参考的位置无关紧要。在两种情况下,您如何初始化PendingIntent

如果两个PendingIntents代表相同的操作,则认为它们相等  相同的包裹。基本上,如果您使用等效Intent初始化两个PendingIntents,它们将被视为相等。编辑:文档显然是错误的,在比较PendingIntents时也使用requestCode。见评论和其他答案。