Подтвердить что ты не робот

Должен ли я использовать AlarmManager или Handler?

Я пишу приложение, которое постоянно проверяет датчики устройства, и каждый так часто должен записывать некоторые статистические данные в файл. Это может быть так же быстро, как раз в секунду или медленнее один раз в минуту. Должен ли я использовать метод Handler's postDelayed() или просто планировать его с помощью AlarmManager?

4b9b3361

Ответ 1

Я бы сказал, что это зависит от интервала опроса. Я предполагаю, что это довольно мало в вашем случае (около нескольких секунд), поэтому вы должны пойти по пути обработчика или с помощью класса Timer.

AlarmManger - это гораздо более высокий уровень обслуживания, и он требует больших накладных расходов для обработки этого варианта использования. Когда срабатывает тревога, вам необходимо обработать его с помощью BroadcastReceivers. Это означает, что каждый раз, когда вы обрабатываете один из этих сигналов, вам необходимо зарегистрировать слушателей для интересующих вас датчиков, что крайне неэффективно imho.

Ответ 2

Это должно помочь вам различать Handler и AlarmManager. [источник]

Хотя это согласовано, они в основном работают для API 23. Это новая версия.

Блок-схема для фоновой работы, аварийных сигналов и вашего приложения для Android

Ответ 3

Если приложение должно работать в режиме ожидания, то AlarmManager. Если нет, то Handler.
AlarmManager запустит процессор, поэтому он будет больше разряжать батарею, а Handler не будет работать в режиме ожидания.

Ответ 4

Решите свой дизайн на основе следующих ключевых моментов:

AlarmManager: Преимущество с AlarmManager заключается в том, что он работает, даже если устройство находится в глубоком спящем режиме (CPU выключен). Когда срабатывает аварийный сигнал, он попадает в BroadcastReceiver и в onReceive, он получает блокировку следа (если вы использовали WAKEUP типы сигналов тревоги, например RTC_WAKEUP или ELAPSED_TIME_WAKEUP). По окончании onReceive() он освобождает блокировку слежения.

Но большую часть времени он НЕ РАБОТАЛ для меня. Таким образом, я приобрел свои собственные блокировки следа в onReceive() и выпустил их в конце, чтобы убедиться, что я действительно получаю CPU.

Причина, по которой это НЕ РАБОТАЕТ, заключается в том, что, когда несколько приложений одновременно используют ресурс (например, блокировки от бодрствования, которые препятствуют приостановке системы), платформа распределяет потребление ЦП в этих приложениях, хотя и не обязательно одинаково. Итак, если это важно, всегда лучше приобретать блокировки слежения и делать вещи.

Таймеры и обработчики: Handler и таймеры не работают в режиме глубокого спящего режима, то есть задача /runnable не будет выполняться в соответствии с расписанием, когда устройство спит. Они не учитывают время во сне, а это означает, что задание задержки для выполнения задачи будет рассчитываться только в активном режиме. Таким образом, фактическая задержка будет задерживаться + время, затраченное на глубокий сон.