Подтвердить что ты не робот

Android Broadcast Receiver vs Service

Я пытаюсь уточнить разницу между широковещательным приемником и службой в android.

Я понимаю, что действие может запустить службу, вызвав startService с намерением.

Широковещательный приемник может быть зарегистрирован в коде или манифесте и может быть вызван с помощью sendBroadcast.

Когда вы используете один против другого?

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

4b9b3361

Ответ 1

Сервисы предназначены для выполнения действия в фоновом режиме в течение некоторого периода времени, независимо от того, что пользователь делает на переднем плане (пользователь может переключаться между действиями). Хорошим примером может служить музыкальный плеер - пользователь начинает играть музыку через приложение для музыкального плеера, но когда они выходят из приложения, музыка продолжает играть.

Службы также полезны для предоставления/управления общим доступом к ресурсу в нескольких приложениях. Это часто используется для системных ресурсов, таких как датчики.

Приемники широковещательной рассылки предназначены для реагирования на намерение (обычно одно, отправленное службой или системным событием), что-то делать и делать. Например, пользователь может подключить телефон с поддержкой NFC к тегу, система создает для него намерение, и зарегистрированный приемник обрабатывает его, чтобы изменить некоторые настройки (изменить громкость, включить Bluetooth и т.д.).

Когда намерение транслируется через sendBroadcast, оно будет отправлено всем получателям, у которых есть соответствующие фильтры намерений. Тем не менее, важно отметить, что в API26 + большинство получателей, зарегистрированных в манифесте, больше не вызывают в таких ситуациях, см. документы Google для получения дополнительной информации.


Пример 1: предположим, что вы хотите открыть функцию (которая будет доступна из любого приложения, которое хочет ее использовать), которое просит веб-сайт рассчитать степень разделения от Кевина Бэкона.

Обратите внимание, что этот пример - "делать что-то и возвращать", а не выполнять длительную фоновую операцию.

Вы можете реализовать это несколькими способами:

Создайте проект библиотеки, который все пользователи компилируют в свое приложение.

  • Теперь есть несколько копий вашего кода, и все они могут быть разными версиями.
  • Невозможно выполнить пакетный или кеш-запрос, поскольку каждый запрос обрабатывается независимо.

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

  • Ваше приложение регистрирует широковещательный приемник для принятия намерения, задающего вопрос Бэкона.
  • Каждое приложение отправляет задание, чтобы задать вопрос.
  • Приемник широковещательной передачи принимает намерение и либо
    • Проводит запрос к службе для выполнения обработки, которая отправляет намерение запрашивающему лицу с результатом
    • Отправляет запрос серверу, который будет отвечать с использованием облачных сообщений Google, когда это будет сделано
  • Поскольку все запросы проходят через одно приложение, вы можете выполнять результаты пакетного/кэширования
  • Это всегда асинхронно
  • API - это "намерения" - не самый дружелюбный способ раскрытия вашей функциональности.

Создать службу для обработки каждого запроса

  • Ваше приложение создает службу для обработки запросов и предоставляет API через Binder или используя AIDL
  • API может быть синхронным (прямой вызов и возврат) или асинхронным (разрешить регистрацию слушателя и вызвать слушателя, когда результат будет готов). Вы должны выбирать только синхронно, если ожидается, что обработка будет очень быстрой; серверные вызовы чаще обрабатываются асинхронно.
  • API - это "вызовы методов" - гораздо более дружелюбный способ раскрытия функциональности

Пример 2: Вы хотите выполнить некоторый анализ данных, чтобы найти некоторые шаблоны в ваших данных

Фоновая тема Если вся обработка должна произойти, когда пользователь находится в том же приложении и в том же действии, фоновый поток (или AsyncTask, который управляет фоновым потоком) будет хорошим подходом

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

Ответ 2

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

Цитата Dianne Hackborn в блоге разработчиков Android:

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

Широковещательные приемники ограничены максимальным количеством времени (обычно 10 секунд), они должны заканчиваться.

Сервис

Если ваше действие занимает больше времени (подключение к Интернету может занять некоторое время). Еще лучше, чем при запуске на фоне. Для этой цели вам обязательно нужно позвонить из получателя или мероприятия. Они в последний раз должны быть убиты операционной системой Android.

Вывод:

  • Вообще говоря, вся работа (выборка, разбор, кеширование, обновление базы данных), которая важна для вашего приложения, должна быть перенесена на Service, поскольку они долгое время живут на Android. Поскольку вы почти считаете, что на всех сайтах социальных сетей есть STICKY_SERVICES, что делает всю трудную работу.

  • BroadcastReceiver используются в основном для запуска службы. Обычно это зависит от приложения. Большинство приложений использует ConnectivityManager для трансляции всякий раз, когда сеть UP или DOWN. С помощью этих Service запускаются BroadcastReceiver.

Ответ 3

Сначала прочитайте документацию для Broadcast Receiver и Услуги.

Здесь вы можете найти полезные учебники здесь и здесь.

наконец, чтобы сделать длинный рассказ коротким:

Служба запускается по вашему запросу (startService (намерение)). Вы можете придумать приемник Broadcast в качестве приемника намерений.