0

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

Правильно ли эта интерпретация? Всегда ли это правильно? Если нет, укажите пример, когда это неверно.

Спасибо большое!

ответ

1

Я имею в виду, что это было бы излишним, чтобы создать 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, что отлично.

Смежные вопросы