Таймер Android, который работает, когда устройство находится в спящем режиме

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

Моя первая попытка заключалась в использовании Handler.postDelayed () для запуска часов. тикает каждые 200 мс и WindowManager.LayoutParms.FLAG_KEEP_SCREEN_ON , чтобы гарантировать, что «часы» не были остановлены тайм-аутом экрана. Но вскоре я узнал, что этот подход можно обойти, нажав кнопку питания, чтобы вручную перевести устройство в спящий режим. Кроме того, в подходе postDelayed () наблюдается некоторый сдвиг часов, по-видимому, из-за времени, затраченного на метод run (). Фактические числа по-прежнему точны, но вместо того, чтобы быть выровненными, например, по 5-секундным границам, которые легко понимаются пользователями, задействованные таймеры начинают дрейфовать, что приводит к некоторой понятной путанице для пользователей.

После небольшого исследования я нашли методы использования служб, java-таймеров , AlarmManager и PartialWakeLock для реализации таймеров. Сами по себе сервисы не решат проблему, связанную с переходом устройства в спящий режим. Таймеры Java, как и сервисы, не t решить проблему с переходом устройства в спящий режим. AlarmManager кажется хорошим подходом, но я обеспокоен тем, что это неправильное использование AlarmManager (т.е. очень короткие интервалы между сигналами тревоги). Использование PartialWakeLock также выглядит многообещающим, но само по себе оно не решает проблему дрейфа часов, с которой я столкнулся.

Я собираюсь попробовать комбинацию AlarmManager и PartialWakeLock. Идея состоит в том, что AlarmManager поможет бороться с дрейфом часов, а PartialWakeLock поможет упростить код (скрестив пальцы). Я надеюсь, что этот подход приведет к разумному балансу между энергосбережением, сложностью кода и ожиданиями пользователей. Мы очень ценим любые советы.

Спасибо,

Rich

13
задан Community 23 May 2017 в 12:32
поделиться