2015-12-20 2 views
1

Может кто-то может различать сценарии, в которых следует использовать широковещательный приемник, AIDL (язык определения интерфейса Android) и посланник? Мне сказали, что использование широковещательного приемника - это разряд батареи, поэтому я не должен ее использовать. AIDL и мессенджеры используются для IPC (межпроцессное взаимодействие), но я могу использовать способ AIDL для передачи данных из службы в действие в рамках одного и того же процесса.В чем разница между широковещательным приемником, AIDL и Messenger?

Итак, должен ли я использовать AIDL или широковещательный приемник?

+0

@BSMP Спасибо за редактирование, но я тоже ожидал ответа. – JavaN00b

ответ

3

================ UPDATE 24 янв 2015 ================= ===
для понимания разницы между Посланником и механизмом AIDL, as per documentation

Использование Посланником
Если вам нужен интерфейс для работы в различных процессах, вы можете создать интерфейс для службы с Посланником. Таким образом, служба определяет обработчик, который отвечает на разные типы объектов Message. Этот обработчик является основой для Messenger, который затем может передавать IBinder с клиентом, позволяя клиенту отправлять команды службе с использованием объектов Message. Кроме того, клиент может определить собственный Messenger, чтобы служба могла отправлять сообщения обратно. Это самый простой способ выполнения межпроцессного взаимодействия (IPC), поскольку Messenger ставит в очередь все запросы в один поток, так что вам не нужно проектировать свою службу в потокобезопасной.

Использования AIDL
AIDL (Android Interface Definition Language) выполняет всю работу, чтобы разложить объекты в примитивы, что операционная система может понять и Маршалловы их через процессы для выполнения IPC. Предыдущий метод, использующий Messenger, фактически основан на AIDL в качестве его базовой структуры. Как упоминалось выше, Messenger создает очередь всех клиентских запросов в одном потоке, поэтому служба получает запросы по одному за раз. Если, однако, вы хотите, чтобы ваша служба обрабатывала несколько запросов одновременно, вы можете напрямую использовать AIDL. В этом случае ваш сервис должен иметь возможность многопоточности и быть потокобезопасным. Чтобы использовать AIDL напрямую, вы должны создать файл .aidl, который определяет интерфейс программирования. Инструменты Android SDK используют этот файл для создания абстрактного класса, который реализует интерфейс и обрабатывает IPC, который вы затем можете расширить в своей службе.

В дополнении к тому, что говорят документы, реализация AIDL включает в себя написание кода шаблонного для сортировочных и демаршалинга передаваемых данных (используя Parcelable интерфейса) с возможностью принимать запросы от нескольких потоков одновременно, в то время как Messenger ставит в очередь сообщения и делает тяжелый подъем, но по одному запросу в то время.


Для взаимодействия службы и деятельности вы должны использовать асинхронный механизм обратного вызова. Обходной путь довольно прост, используя EventBus библиотека. Он в основном использует broadcastreceivers для отправки сообщений и обмена данными между различными компонентами вашего приложения.
Я настоятельно рекомендую вам взглянуть на this tutorial и ссылки, так как EventBus - это в настоящее время одна из наиболее часто используемых библиотек в разработке android.

+0

Не могли бы вы рассказать мне разницу между AIDL и мессенджером с использованием прецедента? – JavaN00b

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