У меня есть частичное решение моего первоначального поста выше. Он еще не учитывает дрейф часов, связанный с временем, потраченным на вычисления при обработке postDelayed () , но это шаг вперед. Кроме того, это обманчиво просто, всегда хороший знак.
Оказывается, я использовал SystemClock.uptimeMillis () , когда мне следовало использовать SystemClock.elapsedRealtime () . Разница между двумя тонкими, но важными.
Как и следовало ожидать, мое решение отслеживает прошедшее время, накапливая длительности между вызовами postDelayed () - , т.е. прошедшее время = elapsedTime + lastClockInterval . Как указано выше, исходная реализация использовала uptimeMillis () . Внимательное чтение javadoc показывает, что uptimeMillis () не включает время, проведенное в «глубоком сне», например, когда пользователь нажимает кнопку питания. Но метод elapsedRealtime () включает время, проведенное в режиме «глубокого сна». Все, что требовалось для отслеживания времени в циклах глубокого сна, - это заменить использование uptimeMillis () на elapsedRealtime () . Успех! Нет необходимости использовать AlarmManager, PartialWakeLock или что-либо еще более сложное. Конечно, эти методы по-прежнему имеют применение, но они излишни при реализации простых часов или таймера истекшего времени.
Следующая проблема, которую необходимо решить, связана с смещением тактовых импульсов, вызванным ненулевым временем выполнения, связанным с обработкой postDelayed () . Я надеюсь, что порождение потока для обработки решит эту проблему, позволяя postDelayed () более или менее имитировать асинхронный вызов. Другой подход заключается в настройке времени задержки postDelayed () с учетом времени, потраченного в postDelayed () . Я опубликую свои результаты.
По несвязанной ноте, во время моего расследования я угощал себя CommonsWare Warescription . Хотя я напрямую не использовал идеи из этого источника для этой проблемы, я думаю, что в обозримом будущем она станет моим источником информации для Android. У меня есть подписка O'Reilly на мою повседневную работу, но я обнаружил, что книги CommonsWare являются таким же хорошим, если не лучшим источником информации о разработке Android, как ресурсы O'Reilly. И я нашел ресурсы O'Reilly Safari довольно хорошими. Интересно ...
Ура,
Рич