Нужно ли получать блокировку пробуждения при вызове BroadcastReceiver?

В книге Pro Android 4 Сатья Коматинени, Дэйв Маклин я нашел:

Android получает частичную блокировку пробуждения при вызове широковещательной службы и освобождает ее, когда возвращается из службы в основном потоке.

Означает ли это, что ОС Android гарантирует, что устройство выйдет из спящего режима на время прохождения onReceive из BroadcastReceiver? В моем случае BroadcastReceiver должен получить намерение от сервисов Google Play (GoogleLocationServices, а точнее API Geofences).

Где это задокументировано?

РЕДАКТИРОВАТЬ: я также нашел это здесь :

потому что гарантируется, что BroadcastReceiver.onReceive() всегда будет полностью выполняться до того, как ЦП перейдет в спящий режим.


person Marian Paździoch    schedule 10.12.2014    source источник


Ответы (1)


Нет такого понятия, как "служба вещания".

Кроме того, вам необходимо прочитать весь пост, содержащий вашу вторую цитату, так как она только для трансляции, инициированной AlarmManager. Именно AlarmManager, а не широковещательный механизм Intent содержит WakeLock. Кроме того, как отмечается в этом сообщении в блоге, Дайан Хакборн подтвердила это поведение, и она является основным инженером Android.

Означает ли это, что ОС Adnroid гарантирует, что устройство проснется на время прохождения onReceive of BroadcastReceiver?

Обычно нет.

В моем случае BroadcastReceiver должен получить намерение от Сервисов Google Play (GoogleLocationServices и, если быть точным, Geofences API).

Если в документации по сервисам Google Play не содержится никаких заявлений относительно поведения вашего приемника в отношении бодрствования, вам следует предположить, что вы не находитесь внутри WakeLock. Если работа требует 1-2 мс и, следовательно, в любом случае ее безопасно выполнять в onReceive(), вы можете рискнуть и пропустить WakeLock и надеяться на лучшее.

Но обычно подобная широковещательная рассылка вызывает больше работы, связанной с дисковым вводом-выводом и/или сетевым вводом-выводом, и вам нужно вывести эту работу из основного потока приложения. Часто вы делаете это, делегируя IntentService, поскольку он дает вам фоновый поток со службой маркеров, чтобы ОС знала, что вы все еще выполняете здесь какую-то работу. И, чтобы гарантировать, что устройство будет бодрствовать для завершения этой работы, используйте WakefulBroadcastReceiver или мой WakefulIntentService, чтобы удерживать WakeLock с начала onReceive() до завершения работы в onHandleIntent().

Где это задокументировано?

АФАИК, это не так. Привыкайте к этому, поскольку для сложных систем обычно документируется лишь малая часть их поведения.

person CommonsWare    schedule 10.12.2014