Android-связь между двумя сервисами - PullRequest
6 голосов
/ 21 апреля 2011

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

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

Есть идеи о том, как это произойдет?

Ответы [ 2 ]

16 голосов
/ 21 апреля 2011

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

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

2 голосов
/ 06 апреля 2017

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

Чтобы достичь необходимого эффекта, вам нужно определить интерфейс для обратного вызова и интерфейс для выполнения действий (с предоставленным обратным вызовом или зарегистрировать / отменить регистрацию методов). Затем, после того, как вы получили какую-либо команду, используя второй интерфейс, вы должны выполнить задание и отправить результат обратно с помощью обратного вызова. Чтобы достичь асинхронного завершения, добавьте ключ работы "oneway" перед сигнатурой метода (тип возвращаемого значения). Чтобы разделить входящие и исходящие параметры (если вам это нужно), используйте ключевые слова «in», «out» и «inout» рядом с параметрами.

Что касается ограничений, то между процессами могут передаваться только примитивы, массивы и парцеллы (и массивы посылок).

Чтобы управлять жизненным циклом обратных вызовов и атомарностью операций, используйте RemoteCallbacksList для хранения зарегистрированных обратных вызовов и уведомления получателей с использованием дубликата вашего списка, полученного от beginBroadcast.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...