Поведение AlarmManager.set (...) не соответствует документации. Я делаю что-то неправильно? - PullRequest
0 голосов
/ 31 октября 2011

Я устанавливаю сигналы тревоги с помощью этого кода

//in onCreate()
mAlarmManager = (AlarmManager) getApplicationContext()
            .getSystemService(ALARM_SERVICE);

//called for each timer I schedule
Intent intent = new Intent (Intents.MY_INTENT_ACTION);
PendingIntent pendIntent = PendingIntent.getBroadcast(
    getApplicationContext(), alert.getID(), 
    intent, PendingIntent.FLAG_ONE_SHOT);
long delay = 1000 * alert.getDuration();
Calendar cal = Calendar.getInstance();
mAlarmManager.set(AlarmManager.RTC_WAKEUP,
    cal.getTimeInMillis() + delay, pendIntent);

Но поведение, которое я вижу, не соответствует тому, что я должен видеть в документации 1 ,

public void set (тип int, long triggerAtTime, операция PendingIntent)

Если для того же IntentSender уже запланирован сигнал тревоги, он сначала будет отменен ... Если уже естьТревога для этого намерения запланирована (с равенством двух намерений, определяемых filterEquals (Intent)), затем он будет удален и заменен этим ...

, который предполагает, что вызывающий набор (inttype, long triggetAtTime, операция PendingIntent) для уже тревожного намерения должно заменить старый сигнал тревоги для этого намерения.Я не вижу, чтобы какие-либо тревоги сбрасывались.Вместо этого, каждый сигнал тревоги, который я установил, срабатывает, несмотря на то, что все намерения, инициированные ожидающими намерениями, должны совпадать (по filterEquals (intent)), поскольку все, что я установил для каждого намерения, является идентичным действием.

Я делаю что-то не так, или API не работает так, как задокументировано?

Примечание: изменение экземпляра PendingIntent на

PendingIntent pendIntent = PendingIntent.getBroadcast(
getApplicationContext(), CONSTANT_ID,
intent, PendingIntent.FLAG_ONE_SHOT);

ведет себя как положено, сбрасывает любой уже установленный сигнал тревогизаменить его новым сигналом тревоги.

Ответы [ 3 ]

0 голосов
/ 31 октября 2011

Вы пробовали с флагом PendingIntent: PendingIntent.FLAG_UPDATE_CURRENT целое число PendingIntent.FLAG_ONE_SHOT?

0 голосов
/ 01 ноября 2011

Похоже, консенсус заключается в том, что документация для AlarmManager.set (), а также других методов AlarmManager, утверждающих, что Intents (а не только PendingIntents), сравнивается, чтобы проверить, установлен ли конкретный сигнал тревоги.

Не полагайтесь на сопоставление Intents в AlarmManager, вместо этого полагайтесь на сопоставление PendingIntents, которое, кажется, работает так, как объявлено.

0 голосов
/ 31 октября 2011

Может быть, это потому, что вы присваиваете каждому будильнику разные идентификаторы (alert.getID() дает разные идентификаторы или нет?). Согласно документации, это не должно иметь значения , но вы все равно должны попробовать.

Если это не сработает, сохраните ссылку на последний установленный будильник, а когда вам нужно отменить его, отмените его самостоятельно, а затем установите следующий.

...