Это из-за режима Doze в Android я никогда не смогу создать точное приложение будильника с помощью AlarmManager?

Я использую AlarmManager, пытаясь создать приложение Alarm для Android. Я заметил, что setRepeating не работает, когда телефон спит. Итак, я попробовал setExactAndAllowWhileIdle.

Но я прочитал это:

В отличие от других будильников, система может перепланировать этот тип будильника, чтобы он срабатывал не по порядку с любыми другими будильниками, даже из того же приложения. Это явно произойдет, когда устройство находится в режиме ожидания (поскольку этот будильник может сработать во время простоя, когда любые другие будильники из приложения будут отложены на потом), но также может произойти, даже когда он не находится в режиме ожидания. Обратите внимание, что ОС позволяет себе более гибко планировать эти сигналы тревоги, чем обычные точные сигналы тревоги, поскольку приложение выбрало такое поведение. Когда устройство находится в режиме ожидания, может потребоваться еще больше вольностей с планированием, чтобы оптимизировать время автономной работы.

Мне нужно точное время, как будильник. Пользователь устанавливает его на 6:00, тогда звонок в 6:01 или 6:02 будет странным! Не звонить вообще из-за того, что телефон простаивает - это катастрофа!

Что я могу сделать сейчас?




Ответы (1)


Не используйте для этой цели повторяющиеся сигналы тревоги. Они недостаточно точны/надежны. Запланируйте один будильник, используя set() или setExact() (в зависимости от вашего целевого уровня API). Когда сработает этот будильник, установите следующий.

ПРИМЕЧАНИЕ. Убедитесь, что вы используете тип будильника, который разбудит телефон:

  • RTC_WAKEUP or
  • ELAPSED_REALTIME_WAKEUP
person David Wasser    schedule 23.06.2017
comment
Хорошо, я полностью избегал повторяющихся будильников, в основном потому, что они вообще не работают после того, как телефон переходит в спящий режим. Но я попытался установить будильник с помощью setExactAndAllowWhileIdle, но проблема в том, что если я устанавливаю его в первый раз в 6:00, он срабатывает. Установка его после стрельбы на 6:01 не будет стрелять до тех пор, пока не пройдет 10-15 минут после предыдущей. Я тестирую с помощью API 23. - person Mena; 24.06.2017
comment
Пожалуйста, используйте setExact(), а не setExactAndAllowWhileIdle(). Это даст вам поведение, которое вы хотите. - person David Wasser; 25.06.2017
comment
Я попробовал следующее, чтобы протестировать push-уведомление в минуту: Работает 2 минуты, потом начинает совсем неточно и с задержкой. Почему? - person Mena; 02.07.2017