Android повторяющаяся тревога не работает - PullRequest
3 голосов
/ 15 января 2011

Это отлично работает:

Intent intent = new Intent(HelloAndroid2.this, AlarmReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(HelloAndroid2.this, 0,
    intent, PendingIntent.FLAG_ONE_SHOT);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (12 * 1000), pendingIntent);

Это не работает.Я слышу будильник только раз.

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (12 * 1000), 3 * 1000, pendingIntent);

Я тоже пробовал это, не повезло:

Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.SECOND, 5);

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 7000, pendingIntent);

В чем проблема?

Ответы [ 2 ]

4 голосов
/ 15 января 2011

Из документа PendingIntent для FLAG_ONE_SHOT:

это может PendingIntent использовать только один раз. Если установлено, после на него вызывается send (), будет автоматически отменяется для вас и любого Будущая попытка отправить через него будет потерпеть неудачу.

Таким образом, после запуска pendingIntent в первый раз, он будет отменен, и следующая попытка отправить его через диспетчер аварий завершится неудачей

Попробуйте использовать FLAG_UPDATE_CURRENT

0 голосов
/ 18 июля 2011

Глядя на ваши примеры кода по порядку:

В вашем первом примере вы используете AlarmManager.set - это строго для одноразовых сигналов, так что да, он будет срабатывать только один раз. Если вы хотите использовать AlarmManager.set, то последнее, что должен сработать код, это установить новый сигнал тревоги (который также должен использовать свежий PendingIntent).

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

Нет причины, по которой ваш сигнал тревоги не должен повторяться каждые 3 секунды, поэтому я бы начал смотреть на реализацию BroadcastReceiver, которую вы написали для обработки сигнала тревоги.

Проверьте, правильно ли вы реализовали это. Закомментируйте весь код в методе onReceive () и вместо этого просто сделайте так, чтобы он записывал сообщение в журнал. Как только вы увидите, что ваше сообщение журнала появляется в logcat при каждом срабатывании будильника, добавьте свой код обратно (сохраняя сообщение журнала) и еще одно сообщение журнала в конец метода. Это позволяет увидеть, сколько времени занимает выполнение метода - вы хотите, чтобы он был завершен до того, как снова сработает сигнализация, чтобы избежать каких-либо неожиданных побочных эффектов.

Кроме того, если вам нужен повторяющийся сигнал тревоги, android.os.Handler - гораздо более эффективный подход, хотя сигналы тревоги, установленные с помощью AlarmManager, срабатывают очень точно.

...