0

Я создаю приложение, которое считывает каждую службу, которая имеет IntentFilter, соответствующий настраиваемое действие с помощью этого:Запуск службы от другого APK из ResolveInfo

Intent intent = new Intent(ACTION); 
List<ResolveInfo> infos = getActivity().getPackageManager() 
       .queryIntentServices(intent, 0); 

У меня нет никаких проблем с извлечением Услуг, но когда я пытаюсь привязать их к текущей Деятельности, моя реализация IBinder не передается в onServiceConnected(ComponentName, IBinder). Вместо этого передается BinderProxy.

Как я могу получить LocalBinder от этого BinderProxy?

EDIT:

Вот моя реализация:

public abstract class LocalService extends Service { 

    private LocalBinder mBinder = new LocalBinder(); 

    public class LocalBinder extends Binder { 

     public LocalService getServiceInstance() { 
      return LocalService.this; 
     } 
    } 

    @Override 
    public final IBinder onBind(Intent intent) { 
     return mBinder; 
    } 

    public abstract List<Category> getInitialCategories(); 

    public abstract void onObjectSelected(Item object, 
      LocalCallback callback); 

} 

То, что я хочу сделать, это быть в состоянии назвать последние 2 метода от реализации других людей моего LocalService.

ответ

1

Я не думаю, что вы можете это сделать.

Вы привязываетесь к услуге в другом процессе. Было бы невозможно получить ссылку на ваш фактический экземпляр LocalBinder, потому что процессы не могут совместно использовать экземпляры объектов.


Я не тестировал этот сценарий сам, но в соответствии с documentation, если вам нужно IPC для служб у вас есть два варианта, либо Messenger или AIDL. Первый кажется намного проще.

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

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

+0

Если я не могу использовать привязку, как я могу связываться между моими «службами» и приложением? им обязательно быть в разных апках. – razielsarafan

+0

Я отредактировал мой вопрос, чтобы дать больше информации о том, чего я хочу достичь. – razielsarafan

+0

@ santirivera92 Отредактированный ответ, хотя он довольно общий, потому что я на самом деле не использовал это. Однако пример в документах, по-видимому, является важным для вашего случая использования. Надеюсь, это полезно. – matiash

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

  • Нет связанных вопросов^_^