Почему мой диспетчер аварийной сигнализации Android запускается мгновенно?

Я следую примеру кода для отправки уведомления об обновлении каждые 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); 

Solutions Collecting From Web of "Почему мой диспетчер аварийной сигнализации Android запускается мгновенно?"

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

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

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

Решение:

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

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