Начиная с API 19, выдача аварийных сообщений является неточной (ОС будет сдвигать аварийные сигналы, чтобы минимизировать количество пробуждений и использование батареи). Это новые API, которые обеспечивают строгие гарантии доставки:
see setWindow(int, long, long, android.app.PendingIntent)
setExact(int, long, android.app.PendingIntent)
Итак, мы можем использовать setExact:
public void setExact (int type,
long triggerAtMillis,
PendingIntent operation)
setExact может Запланировать доставку будильника точно в указанное время.
Этот метод похож на set (int, long, android .app.PendingIntent), но не позволяет ОС корректировать время доставки. Тревога будет доставлена как можно ближе к запрошенному времени запуска.
Сначала используйте setExact
следующим образом:
void scheduleAlarm(Context context) {
AlarmManager alarmmanager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent yourIntent = new Intent();
// configure your intent here
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, MyApplication.ALARM_REQUEST_CODE, yourIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmmanager.setExact(AlarmManager.RTC_WAKEUP, timeToWakeUp, alarmIntent);
}
Теперь, запланируйте следующее вхождение (для повторения) в onReceive
вашего BroadcastReceiver, как показано ниже:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// process alarm here
scheduleAlarm(context);
}
}