Нет такого понятия, как "служба вещания".
Кроме того, вам необходимо прочитать весь пост, содержащий вашу вторую цитату, так как она только для трансляции, инициированной 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