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