Android: отмена набора будильников из другой активности - PullRequest
1 голос
/ 15 августа 2011

Я постараюсь объяснить это как можно лучше.По сути, у меня есть активность 1, которая использует ExternalClass для выполнения различных задач.Упражнение 2 также ссылается на объект Упражнения 1 указанного ExternalClass.Из обоих этих действий я могу устанавливать сигналы тревоги с помощью AlarmManager, но я хочу иметь возможность отменить все сигналы тревоги, созданные в результате любого действия, из действия 1.

Все сигналы тревоги устанавливаются с одинаковым намерением и одинаковымиAlarmManger (оба созданы в ExternalClass), но когда я нажимаю кнопку в Деятельности 1, которая должна вызывать myAlarms.cancel (намерение), она отменяет только те тревоги, которые были созданы с использованием класса Деятельности 1.

На ExternalClass ссылаются в Деятельности 2, ссылаясь на объект этого класса, который был создан в Деятельности 1, поэтому они оба должны использовать один и тот же экземпляр ExternalClass.Я почти уверен, что это не отменяет сигналы тревоги из-за контекста, который использовался при установке сигналов тревоги, но я не могу понять, как обойти это.

Ответы [ 2 ]

5 голосов
/ 16 августа 2011

Чтобы решить эту проблему, я использовал следующий код:

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

Я установил для requestCode уникальный идентификатор.Это внутри цикла 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();
}

}

2 голосов
/ 15 августа 2011

Для отмены и тревоги вам нужно передать эквивалент PendingIntent (что означает p1.equals(p2) возвращает true) тому, который использовался для его создания. Не имеет значения, откуда вы создали ссылку на AlarmManager. Как вы инициализируете PendingIntent в обоих случаях?

Два PendingIntents считаются равными, если они оба представляют одну и ту же операцию из та же самая упаковка В основном, если вы инициализируете два PendingIntents с эквивалентными Intents, они будут считаться равными. РЕДАКТИРОВАТЬ: документация, очевидно, неправильно об этом, код запроса также используется при сравнении PendingIntents. Смотрите комментарии и другие ответы.

...