Я занимаюсь разработкой приложения таймера и хочу, чтобы устройство надежно разбудило в указанное время - независимо от того, находится ли устройство в спящем режиме / режиме ожидания / заблокированном экране и т. Д.
В настоящее время я использую эту настройку:
служба переднего плана, которая удерживает частичную блокировку после его активации
fun start() {
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, wakeLockTag)
wakeLock?.acquire()
}
fun stop() {
if (wakeLock?.isHeld == true) {
wakeLock?.release()
}
}
планирование будильника в реальном времени, когда пользователь оставляет активность таймера:
fun scheduleAtRealElapsedTime(timeToTrigger: Long, firedIntent: PendingIntent) {
val alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP
AlarmManagerCompat
.setExactAndAllowWhileIdle(alarmManager, alarmType, timeToTrigger, firedIntent)
}
добавил эти флаги для активности таймера
fun setupWindowFlags(activity: BaseActivity<*, *>) {
activity.window.addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
)
}
и получение полной блокировки пробуждения при получении намерения тревоги:
fun wakeScreen() = powerManager.newWakeLock(
PowerManager.FULL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP, wakeLockTag)
.acquire(1)
У меня не было проблемы на эмуляторе с этой настройкой, но на моем устройстве Huawei Это кажется ненадежным - Кажется, что сигнал тревоги не срабатывает каждый раз.
Есть ли надежный способ сделать это на 100%?
- Я прочитал документы и обнаружил, что сообщение fcm с высоким приоритетом может обойти спящие устройства, но мое приложение не должно требовать подключения к Интернету для этого
- Документация по диспетчеру аварийных сигналов - метод
setExactAndAllowWhileIdle
говорит о том, что он может быть ненадежным на 100%, если вы планируете слишком много аварийных сигналов за короткий промежуток времени, поэтому это может быть проблемой