Android AlarmManager проблема с настройкой и сбросом будильника - PullRequest
9 голосов
/ 11 февраля 2011

Я использую Alarm для получения данных с сервера. Мне нравится давать пользователю возможность включать и выключать будильник. Это означает, что я должен проверить и посмотреть, установлен ли будильник. Я нашел код, который сообщает мне, если будильник уже установлен:

Intent I = new Intent(getApplicationContext(),AlarmReceiver.class);
PendingIntent P = PendingIntent.getBroadcast(getApplicationContext(), 0, I, PendingIntent.FLAG_NO_CREATE);
found = (P!=null);

если будильник уже установлен, я отменяю его, но если он не установлен, я устанавливаю его (как переключатель)

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

вот код для установки будильника

am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE);
Intent I = new Intent(getApplicationContext(),AlarmReceiver.class);
PendingIntent P = PendingIntent.getBroadcast(getApplicationContext(), 0, I, PendingIntent.FLAG_CANCEL_CURRENT);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60000, P); 

и вот код для отмены тревоги:

am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE);
Intent I = new Intent(getApplicationContext(),AlarmReceiver.class);
PendingIntent P = PendingIntent.getBroadcast(getApplicationContext(), 0, I, PendingIntent.FLAG_CANCEL_CURRENT);
am.cancel(P);

Должен ли я сбросить что-либо после отмены тревоги, чтобы отключить ее PendingIntent.

1 Ответ

49 голосов
/ 20 февраля 2011

При отмене AlarmManager не используйте PendingIntent с флагом FLAG_CANCEL_CURRENT.Вместо этого отмените PendingIntent явно после отмены будильника:

am = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE);
Intent i = new Intent(getApplicationContext(),AlarmReceiver.class);
PendingIntent p = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0);
am.cancel(p);
p.cancel();
...