Я имею в виду, что это было бы излишним, чтобы создать BroadcastReceiver, который запускает IntentService, который выполняет определенную задачу, которая должна быть сделана
не только в том, что не обязательно излишним, это очень распространенная шаблон.
Правильно ли эта интерпретация?
No.
пожалуйста, дайте примеры, когда это неправильно.
Либо Intent
используется с sendBroadcast()
или startService()
. Если Intent
используется с sendBroadcast()
, услуга не может отвечать на нее напрямую. Аналогичным образом, если Intent
используется с startService()
, приемник не может напрямую реагировать на него. Итак, в тех случаях, когда кто-то еще написал код для использования Intent
, вы должны соответствовать тому, как они его использовали. Вы не можете в одностороннем порядке «изменить канал», который используется Intent
.
Кроме того, onReceive()
из BroadcastReceiver
всегда вызывается в основной прикладной нити. Вы не хотите делать сколько-нибудь значимого времени здесь, так как это заморозит ваш пользовательский интерфейс, если ваш пользовательский интерфейс окажется на переднем плане. И, как только onReceive()
вернется, экземпляр приемника, зарегистрированный манифеста, будет отброшен, и вскоре после этого ваш процесс может быть прерван. Следовательно, небезопасно, чтобы BroadcastReceiver
разблокировал собственный фоновый поток, поскольку Android проигнорирует этот поток и прекратит ваш процесс. Общим шаблоном для ответа на широковещательные сообщения, передаваемые системой, является использование BroadcastReceiver
, а затем делегирование этой работы на IntentService
. В одном махом можно решить обе проблемы:
IntentService
делает его тяжелый подъем в onHandleIntent()
, называется на фоне потока
- , потому что это
Service
, имея это работает, делая эту работу будет сигнализировать ОС чтобы ваш процесс жить немного дольше
Теперь, если ты один создания Intent
и вы один диспетчерская, что Intent
и вы один потребляя что Intent
, и вы хотите, чтобы ваше использование кода startService()
, чтобы вызвать IntentService
, что отлично.