Вопрос по android, alarmmanager, android-handler – Должен ли я использовать AlarmManager или Handler?

11

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

Ваш Ответ

4   ответа
2

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

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

Я проверил документацию Timer, что означает, что Timer запускается как поток демона? Это услуга? Moises Jimenez
9

AlarmManager, Если нет то.Handler

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

Когда телефон переходит в спящий режим? Я'Я уже некоторое время тестирую мое приложение, и устройство никогда не переходило в режим ожидания. Moises Jimenez
Мы только что нашли более подробный аналогичный ответ:stackoverflow.com/a/5120225/538169 pawelzieba
11

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

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

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

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

Благодарю. Было бы неплохо показать пример того, как вы приобрели собственные замки. так много сообщений в stackoverflow по таймеру или выполнению заданий с интервалом, и я не смог сделать это последовательно, используя AlarmManager, Handler, BackgroundServices или Sleeps: P Единственное, что у меня нет 'т пытался это то, что объясняется здесьstackoverflow.com/a/11177974 San Jay
17

Handler а также .AlarmManager[источник]

Хотя все согласны, они в основном работают для API 23.новый выпуск

Похожие вопросы