Мне нужно планировать запланированную задачу каждые 10 минут.
Как и в Lollipop, и более высокая версия setRepeating()
неточна, я использую setExact()
и (при срабатывании тревоги) я установил новый точный сигнал тревоги за 10 минут.
private void setAlarm(long triggerTime, PendingIntent pendingIntent) {
int ALARM_TYPE = AlarmManager.ELAPSED_REALTIME_WAKEUP;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(ALARM_TYPE, triggerTime, pendingIntent);
} else {
alarmManager.set(ALARM_TYPE, triggerTime, pendingIntent);
}
}
triggerTime
рассчитывается SystemClock.elapsedRealtime() + 600_000;
Когда срабатывает будильник, сначала я планирую новый, только после этого запускаю свою запланированную задачу.
setAlarm();
mySheduledTask;
У меня есть разрешение WAKE_LOCK
в моем манифесте.
Когда я тестирую это на Android 4 - он отлично работает (отклонение может быть 12-15 миллисекунд).
Но когда я запускаю приложение на Xiaomi Redmi Note 3 Pro (5.1.1) - отклонение может быть до 15 секунд!
Например, я вижу в своем файле журнала: первый запуск был в 1467119934477 (времени RTC), второй - на 1467120541683. Разница 607_206 миллисекунды, а не 600_000, как и планировалось!
Что мне не хватает?. Каким образом можно моделировать поведение системной тревоги (это самая близкая утилита, которая может описать мой подход)?
PS. Я использую IntentService для PendingIntent = PendingIntent.getService(context, 0, myIntent, 0);