100% надежный способ пробуждения устройства в указанное реальное время - PullRequest
0 голосов
/ 11 апреля 2019

Я занимаюсь разработкой приложения таймера и хочу, чтобы устройство надежно разбудило в указанное время - независимо от того, находится ли устройство в спящем режиме / режиме ожидания / заблокированном экране и т. Д.

В настоящее время я использую эту настройку: служба переднего плана, которая удерживает частичную блокировку после его активации

   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%, если вы планируете слишком много аварийных сигналов за короткий промежуток времени, поэтому это может быть проблемой
...