12

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

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

ответ

21

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

+0

Благодаря как +1 от меня для быстрого и точного ответа. К следующей проблеме. Как ни парадоксально, я попытался сделать второй комментарий слишком рано (<15 секунд), поэтому я получаю уведомление таймера от SO. :)) – mobibob

+0

im делает это так: 'amAlarm1.setInexactRepeating (AlarmManager.RTC_WAKEUP, 120000, AlarmManager.INTERVAL_DAY, alarm1Pending); все еще ожидающее намерения стреляет мгновенно ' –

+0

@MuhammadBabar: Вы действительно должны опубликовать новый вопрос. Но чтобы ответить на ваш вопрос в любом случае, вы передаете '120000' на triggerAtTime, что соответствует' Fri, 02 Jan 1970 09:20:00 GMT' – Falmarri

15

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

+0

+1 за тот же ответ, что и у меня =] – Falmarri

+0

Спасибо за +1 за меня за быстрый и точный ответ. К следующей проблеме. – mobibob

3

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

Решение:

cal.add(Calendar.DATE, 1); 

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

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

Смежные вопросы