2

我正在使用 alarmManager 在我的应用程序中设置多个警报并遇到了问题。以这种方式设置 PendingIntent 时:

timerAlarmIntent = PendingIntent.getBroadcast(myContext, 0, alarmIntent, 0);
myAM.set(AlarmManager.RTC_WAKEUP, alarmTime, timerAlarmIntent);

如果 requestCode 设置为 0(在 getBroadcast 中的上下文旁边),我可以使用:

myAM.cancel(timerAlarmIntent);

取消我在应用程序中设置的任何数量的警报。但是,我设置的每个警报都会覆盖最后一个警报,因此只有一个警报最终会响起。如果我将 requestCode 设置为唯一编号,例如:

timerAlarmIntent = PendingIntent.getBroadcast(myContext, i, alarmIntent, 0);
myAM.set(AlarmManager.RTC_WAKEUP, alarmTime, timerAlarmIntent);

其中 i 使用 for 循环设置为每个警报的唯一 ID 号。这样所有警报都可以正常运行,但我无法取消警报,因为在我运行时实际上只有一个警报会取消:

myAM.cancel(timerAlarmIntent);

如何将 requestCode 设置为唯一编号并且还可以选择取消它?

我最终用来解决问题的代码是:

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

要取消 PendingIntents,我设置了以下方法:

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

1 回答 1

1

为什么不将 timerAlarmIntent 对象存储在列表中,并在需要时循环取消它们?

问候, 斯蒂芬

于 2011-08-16T02:19:18.213 回答