Почему мой диспетчер аварийной сигнализации Android срабатывает мгновенно? - PullRequest
13 голосов
/ 29 июля 2010

Я следую примеру кода для отправки уведомления об обновлении каждые 10 секунд. Код следует, и он находится в UpdateService для AppWidgetProvider. Если я поставлю Thread.sleep(10*1000);, я смогу увидеть ожидаемое поведение моего цикла обслуживания. У меня, очевидно, есть что-то принципиально неправильное, что срабатывает немедленно. Это должен быть PendingIntent сигнал тревоги, который будет передавать обновления моему слушателю.

long nextUpdate = 10*1000;
Log.d(TAG, "Requesting next update in " + nextUpdate + " msec." );

Intent updateIntent = new Intent(ACTION_UPDATE_ALL);
updateIntent.setClass(this, UpdateService.class);

PendingIntent pendingIntent = PendingIntent.getService(this, 0, updateIntent, 0);

// Schedule alarm, and force the device awake for this update
AlarmManager alarmManager = (AlarmManager)getBaseContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 
    nextUpdate, pendingIntent);

Ответы [ 3 ]

23 голосов
/ 29 июля 2010

AlarmManager.setRepeating определяется как public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation) 2-й аргумент - это когда он должен быть вызван первым. Вы говорите, чтобы начать с SystemClock.elapsedRealtime(), что сейчас.

16 голосов
/ 29 июля 2010

Вы говорите setRepeating(), что вы хотите, чтобы первый сигнал тревоги немедленно сработал (SystemClock.elapsedRealtime()).Если вы хотите, чтобы первый сигнал тревоги сработал в другой раз, добавьте смещение (SystemClock.elapsedRealtime()+nextUpdate).

6 голосов
/ 04 июля 2014

Если вы создаете PendingIntent для сигнала тревоги за прошедшее время, он будет активирован немедленно. Пример. Запланируйте тревогу на сегодня 8 утра, но выполнение кода около 11 утра немедленно сработает.

Решение:

cal.add(Calendar.DATE, 1);

long delay = 24 * 60 * 60 * 1000;
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), delay,pendingIntent);` 

Это вызовет событие на следующий день в указанное время (т. Е. 8 утра);

...