Почему мой диспетчер аварийной сигнализации 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);
Ответы
Ответ 1
AlarmManager.setRepeating определяется как public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
Второй аргумент - это когда он должен быть сначала вызван. Вы говорите, что начинаете с SystemClock.elapsedRealtime()
, который сейчас.
Ответ 2
Вы сообщаете setRepeating()
, что вы хотите, чтобы первый сигнал тревоги немедленно отключился (SystemClock.elapsedRealtime()
). Если вы хотите, чтобы первый сигнал тревоги погас в другое время, добавьте смещение (SystemClock.elapsedRealtime()+nextUpdate
).
Ответ 3
Если вы создаете PendingIntent сигнала тревоги в течение прошедшего времени, он будет запущен немедленно. Пример. Запланируйте будильник на сегодняшний день 8AM, но код выполнения около 11 утра будет немедленно срабатывать.
Решение:
cal.add(Calendar.DATE, 1);
long delay = 24 * 60 * 60 * 1000;
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), delay,pendingIntent);`
Это приведет к срабатыванию события на следующий день в указанное время (т.е. 8AM);