Я пишу приложение, которое постоянно проверяет датчики устройства, и каждый так часто должен записывать некоторые статистические данные в файл. Это может быть так же быстро, как раз в секунду или медленнее один раз в минуту. Должен ли я использовать метод Handler's
postDelayed()
или просто планировать его с помощью AlarmManager
?
Должен ли я использовать AlarmManager или Handler?
Ответ 1
Я бы сказал, что это зависит от интервала опроса. Я предполагаю, что это довольно мало в вашем случае (около нескольких секунд), поэтому вы должны пойти по пути обработчика или с помощью класса Timer.
AlarmManger - это гораздо более высокий уровень обслуживания, и он требует больших накладных расходов для обработки этого варианта использования. Когда срабатывает тревога, вам необходимо обработать его с помощью BroadcastReceivers. Это означает, что каждый раз, когда вы обрабатываете один из этих сигналов, вам необходимо зарегистрировать слушателей для интересующих вас датчиков, что крайне неэффективно imho.
Ответ 2
Это должно помочь вам различать Handler
и AlarmManager
.
[источник]
Хотя это согласовано, они в основном работают для API 23. Это новая версия.
Ответ 3
Если приложение должно работать в режиме ожидания, то AlarmManager
. Если нет, то Handler
. AlarmManager
запустит процессор, поэтому он будет больше разряжать батарею, а Handler
не будет работать в режиме ожидания.
Ответ 4
Решите свой дизайн на основе следующих ключевых моментов:
AlarmManager:
Преимущество с AlarmManager
заключается в том, что он работает, даже если устройство находится в глубоком спящем режиме (CPU выключен). Когда срабатывает аварийный сигнал, он попадает в BroadcastReceiver
и в onReceive
, он получает блокировку следа (если вы использовали WAKEUP
типы сигналов тревоги, например RTC_WAKEUP
или ELAPSED_TIME_WAKEUP
). По окончании onReceive()
он освобождает блокировку слежения.
Но большую часть времени он НЕ РАБОТАЛ для меня. Таким образом, я приобрел свои собственные блокировки следа в onReceive()
и выпустил их в конце, чтобы убедиться, что я действительно получаю CPU.
Причина, по которой это НЕ РАБОТАЕТ, заключается в том, что, когда несколько приложений одновременно используют ресурс (например, блокировки от бодрствования, которые препятствуют приостановке системы), платформа распределяет потребление ЦП в этих приложениях, хотя и не обязательно одинаково. Итак, если это важно, всегда лучше приобретать блокировки слежения и делать вещи.
Таймеры и обработчики:
Handler
и таймеры не работают в режиме глубокого спящего режима, то есть задача /runnable не будет выполняться в соответствии с расписанием, когда устройство спит. Они не учитывают время во сне, а это означает, что задание задержки для выполнения задачи будет рассчитываться только в активном режиме. Таким образом, фактическая задержка будет задерживаться + время, затраченное на глубокий сон.