AlarmManager.setAlarmClock выдает сигналы тревоги в неправильное время? - PullRequest
0 голосов
/ 14 мая 2018

Я работаю над приложением, основанным на программировании сигналов тревоги с помощью метода AlarmManager.setAlarmClock.В основном это работает, но в некоторых случаях сигналы тревоги генерируются в неправильное время.

Например, в устройстве Samsung с Android 5.1 я установил 3 сигнала тревоги в:

  • 18:00
  • 22: 00
  • 6: 00 (на следующий день)

И результат будет

  • 18: 00 ->ОК
  • 18: 15 -> Брошено в 18: 15
  • 6: 00 -> Брошено в 2:00 !!

Вот код для настройкиаларм:

if (Build.VERSION.SDK_INT >= 21) {
        Log.d(TAG, "Final (idle) at " + sdf.format(calendarObj.getTime()));
        AlarmManager.AlarmClockInfo info = new AlarmManager.AlarmClockInfo(calendarObj.getTimeInMillis(), pendingIntent);
        alarmManager.setAlarmClock(info, pendingIntent);
    }

И это код для генерации экземпляров «calendarObj» (объект iqDate - это объект с определенной датой, и три тревоги устанавливаются на основе даты этого объекта.Просто проигнорируйте это):

Calendar c1 = Calendar.getInstance();
c1.setTime(iqDate.getTime());
c1.add(Calendar.DAY_OF_MONTH, -1);
c1.set(Calendar.HOUR_OF_DAY, 18);
c1.set(Calendar.MINUTE, 0);
c1.set(Calendar.SECOND, 0);

Calendar c3 = Calendar.getInstance();
c3.setTime(iqDate.getTime());
c3.add(Calendar.DAY_OF_MONTH, -1);
c3.set(Calendar.HOUR_OF_DAY, 22);
c3.set(Calendar.MINUTE, 0);
c3.set(Calendar.SECOND, 0);

Calendar c7 = Calendar.getInstance();
c7.setTime(iqDate.getTime());
c7.set(Calendar.MINUTE, 0);
c7.set(Calendar.SECOND, 0);
c7.set(Calendar.HOUR_OF_DAY, 6);

Есть идеи, почему это происходит?Это работает в большинстве случаев, но иногда тревоги не работают должным образом ...

Спасибо!

1 Ответ

0 голосов
/ 14 мая 2018

Начиная с API 19 (android.os.Build.VERSION_CODES.KITKAT) доставка аварийных сигналов не точна: ОС будет сдвигать аварийные сигналы, чтобы минимизировать пробуждения и использование батареи.Существуют новые API для поддержки приложений, которым требуются строгие гарантии доставки;см. setWindow (int, long, long, android.app.PendingIntent) и setExact (int, long, android.app.PendingIntent).Приложения, у которых targetSdkVersion более ранний, чем API 19, будут продолжать видеть предыдущее поведение, при котором все тревоги доставляются точно по запросу.

...