3

Позвольте мне начать с признания того, что я изучаю (или пытаюсь изучить) Android, а также делаю то, что кажется несколько сложным.Правильный способ использования блокировки слежения (минимизация использования аккумулятора) для обработки входящих SMS-сообщений

Хотя я думаю, что понял базовое использование BroadcastReceivers, и я могу использовать его для получения SMS и выполнять некоторую обработку, я бы хотел, чтобы эта обработка выполнялась, даже когда устройство переходит в режим сна. Читая и задавая вопрос (this one), я понимаю, что мне нужно приобрести PARTIAL lock lock (чтобы поддерживать активный процессор, а экран + клавиатура спит), до обрабатывать входящие SMS-запросы, что очень важно основное приложение обмена сообщениями (или, например, Hangouts или другие общие приложения для обмена сообщениями), которые могут принимать входящие SMS-сообщения и мигать светодиод уведомления и вибрировать (если это настроено для этого).

Однако то, что я запутался о заключается в следующем:

  • Wake замок должен быть приобретен, когда работа должна быть сделана, и выпустили, когда нет работы предстоит сделать. Если блокировка волка активирована и никогда не выпускается, вы разряжаете аккумулятор намного быстрее.
  • Если это верно, то как ожидается, что приложение для чтения SMS будет немедленно уведомлено (возможно, используя BroadcastReceiver) о входящем сообщении, не имея необходимости постоянно получать блокировку слежения?
  • Один из способов, который приходит мне на ум, - использовать Сервис, который в основном спит, и только периодически просыпается, чтобы проверить, есть ли какие-либо СМС. Тем не менее, это противоречит логике того, что входящие SMS и соответствующее соответствующее вещательное намерение могут произойти в любое время, явно с достаточной возможностью для приложения miss трансляция.

Итак, как можно разработать приложение, которое:

не
  • не пропускает, все входящие SMS, и, надеюсь, будет уведомлен, как только он приходит (даже когда устройство иначе спит)
  • Потребляет минимальная батарея, тем более, что обработка SMS Broadcast Intent очень мала и проста ... вычислительно минимальна.

Edit (12-сентября-2014)

В то время как я принял ответ, я хотел бы добавить, что я понял, хотя я до сих пор не 100% уверен, что мое понимание верный.

Я понял, что на устройстве с низким уровнем (операционная система, прошивка и устройство HW) на устройстве Android, когда устройство переходит в режим сна, есть несколько событий, которые могут вызвать «пробуждение». Сетевые события, события клавиатуры, некоторые (если не все) события датчика, события таймера и т. Д. Заставят устройство проснуться, а быстро обработать событие и попробовать лучше вернуться к отпуску как можно скорее. Насколько я понимаю, последний бит - это ключ. Это означает, что такие события, как входящий вызов, входящие SMS, нажатия клавиш или другие причины, приводящие к трансляции, всегда приводят к созданию намерения и доставляются во все зарегистрированные BroadcastReceivers. Эта часть обеспечена. Однако то, что не обеспечивается, заключается в том, что всем вещателям BroadcastReceivers будет достаточно времени, чтобы тратить столько времени, сколько необходимо для обработки намерения. Вместо этого им необходимо приобрести блокировку Wake (соответствующего типа) и обеспечить, чтобы устройство не возвращалось спать до тех пор, пока не будет освобождена блокировка Wake.Теперь, насколько я понимаю, существует множество способов приобретения блокировки Wake. Это можно сделать непосредственно в BroadcastReceiver, но, по-видимому, не всегда интуитивно понятно, что является лучшим и наиболее эффективным способом управления им, s.t. он удерживается в течение наименьшего количества времени и освобождается, как только это не требуется. Для этого SDK обеспечивает механизм «WakefulBroadcastReceiver», что делает задачу написания программного обеспечения, которое упростило BroadcastIntent, когда требуется блокировка слежения. Тогда есть альтернатива WakefulIntentService, разработанная CommonsWare (если я не ошибаюсь, это не от SDK, а от третьей стороны).

Я надеюсь, что я прав :)

Edit (13-сентября-2014)

Более подробная информация доступна в this SO Q&A

ответ

2

Существует широковещательный для входящих SMS (быстрый Google поиск дал android.provider.Telephony.SMS_RECEIVED). Итак, вы настроили приемник для этого (quick google). В приемнике вы начинаете WakefulIntentService (это управляет вашими вакелоками). Это все.

WIS - это ответ на ваш другой вопрос.

+0

Thanks Mr_and_Mrs_D. Хотя я знаю о намерениях трансляции, я не был уверен, возможно ли, что определенные намерения не будут доставлены, когда телефон спит. Однако с прошлой ночи, основываясь на том, что я читал, пока никто не говорит так явно, но я считаю намерение s.a. этот, ** всегда ** доставлен, хотя получающий Получатель может не получить достаточно времени для обработки намерения, если только они не приобретут блокировку Частичного следа. – icarus74

+0

@ icarus74: если обработка должна выполняться в любое время, когда вы _must_ делегировать службе намерения, а именно услугу бодрствования, в этом есть wakelock, который покрывает промежуток между onReceive() и началом обработки обслуживания. –

+0

Спасибо. Ответ принят. – icarus74