Широковещательный приемник и ResultReceiver в android

В чем разница между BroadcastReceiver и ResultReceiver в android?

Solutions Collecting From Web of "Широковещательный приемник и ResultReceiver в android"

Получатель результата:

Generic interface for receiving a callback result from someone. 

Широковещательный приемник:

 Base class for code that will receive intents sent by sendBroadcast(). 

РЕДАКТИРОВАТЬ:

Справочная информация. Все сетевые операции / длительные операции должны выполняться в стороне от основного потока. Два способа сделать это:

  1. Задача Async – для простых сетей, например, повторить обработку изображения / сделать db
  2. Сервис – для сложного многолетнего фонового процесса

Если вам необходимо выполнить работу вне основного потока, но только в то время, когда пользователь взаимодействует с вашим приложением, вам, вероятно, следует вместо этого создать новый поток, а не службу. Например, если вы хотите воспроизвести какую-либо музыку, но только во время работы, вы можете создать Async Thread. Но если вы хотите, чтобы процесс продолжался даже после выхода пользователя из приложения (скажем, загрузка), используйте службу

Допустим, вы выбрали 2. Теперь

  1. Ваша деятельность отправляет веб-запрос на ваш сервис
  2. Ваша служба выполняет это, используя команду DefaultHttpClient
  3. Он отправляет данные в вашу деятельность.

    Третий этап приема данных здесь можно сделать двумя способами:

1.) Широковещательный приемник. Несколько приемников могут принимать ваши данные. Используется, если вы хотите отправлять данные / уведомления по всем приложениям (например, вы также взаимодействуете с fb и twitter, несколькими приемниками для вашего веб-трансляции), когда вы отправляете широковещательную рассылку своей системы.

2.) Приемник результатов: ваше приложение является единственным получателем данных. Это интерфейс, который вы реализуете, и передаете его в службу намерения через putExtra. Затем IntentService извлечет этот объект и вызовет функцию receiver.send, чтобы отправить что-либо (в комплекте) в вызывающую активность. Ресивер получателя имеет предпочтение по отношению к широковещательным приемникам, если все ваше сообщение является внутренним для вашего приложения

EDIT: Я должен также упомянуть об этом предостережении

Внимание . Служба работает в основном потоке своего хостинга – служба не создает свой собственный поток и не запускается в отдельном процессе (если вы не указали иначе). Это означает, что если ваша служба будет выполнять любую интенсивную работу или блокировку процессора (например, воспроизведение MP3 или сетевое взаимодействие), вы должны создать новый поток в службе для выполнения этой работы. Используя отдельный поток, вы уменьшите риск ошибок приложения, не отвечающих (ANR), и основной поток приложения может оставаться посвященным взаимодействию пользователя с вашими действиями.

BroadcastReceiver – приемник, получающий широковещательные передачи. Они отправляются кем-то в намерении, что их может принимать много приемников (например, радиопередачи).

С другой стороны, ResultReceiver предназначен для получения результата обратного вызова от кого-то. Таким образом, это можно сравнить с рацией, где вы звоните кому-то, а затем получите ответ (результат) от того, кого вы вызвали.

Эти два класса совершенно разные. На самом деле это та же разница, что и между трансляцией и результатом .

  • Что это трансляция? Простыми словами это сообщение, которое видимо для всей системы, и оно может потребляться каждой частью системы (которая знает контракт), она не была вызвана smb reuest;
  • Что такое результат? Это то, что мы ожидаем получить от другой части системы. Обычно для результата есть только один приемник, и обычно получатель запрашивает обработку для получения результата (ощущайте разницу – для трансляции никто не должен делать какой-либо «запрос», чтобы он появился);

Это объяснение с логической точки зрения. С точки зрения кода, если вы будете сравнивать BroadcastReceiver и ResultReceiver, вы можете наблюдать огромную разницу. В принципе оба класса построены поверх IPC, но BroadcastReceiver намного сложнее из-за его различного характера (который я попытался объяснить в первой части).

Широковещательный приемник

Широковещательный приемник является компонентом, который реагирует на широковещательные сообщения в рамках всей системы. Например, широковещательная передача, объявляющая, что экран выключен, батарея разряжена или снимок сделан. Приложения также могут инициировать широковещательные передачи – например, чтобы другие приложения знали, что некоторые данные были загружены на устройство и доступны для них. Хотя широковещательные приемники не отображают пользовательский интерфейс, они могут создавать уведомление в строке состояния, чтобы предупредить пользователя о появлении события трансляции. Тем не менее, широковещательный приемник является всего лишь «шлюзом» для других компонентов и предназначен для выполнения минимально необходимого объема работы. Например, он может инициировать службу для выполнения некоторой работы, основанной на событии.

Приемник результатов

Если ваша служба будет частью вашего приложения, вы сделаете ее более сложной, чем она должна быть. Поскольку у вас есть простой пример получения некоторых данных из Restful Web Service, вы должны изучить ResultReceiver и IntentService .

Этот шаблон Service + ResultReceiver работает путем запуска или привязки к службе с помощью startService (), когда вы хотите выполнить какое-либо действие. Вы можете указать операцию для выполнения и передачи в свой ResultReceiver (активность) через дополнительные функции в намерении.