2011-01-15 2 views
3

Это прекрасно работает:сигнализации повторив Android не работает

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); 

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

ответ

3

Из PendingIntent doc для FLAG_ONE_SHOT:

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

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

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

+0

Это было очень легко. Спасибо. – erdomester

0

Глядя на ваши образцы кода в заказывайте:

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

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

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

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

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