Запуск сервиса с другого Apk из ResolveInfo
Я создаю приложение, которое читает каждый Сервис, у которого есть IntentFilter, который соответствует настраиваемому действию, используя это:
Intent intent = new Intent(ACTION);
List<ResolveInfo> infos = getActivity().getPackageManager()
.queryIntentServices(intent, 0);
У меня нет проблем с извлечением Служб, но когда я пытаюсь привязать их к текущей Деятельности, моя реализация IBinder не передается onServiceConnected(ComponentName, IBinder)
, Вместо этого BinderProxy
проходит
Как я могу получить мой LocalBinder
От этого BinderProxy
?
РЕДАКТИРОВАТЬ:
Вот моя реализация:
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
экземпляр, потому что процессы не могут совместно использовать экземпляры объекта.
Я сам не тестировал этот сценарий, но согласно документации, если вам нужен IPC для служб, у вас есть две альтернативы: Messenger или AIDL. Первый кажется намного проще.
Если вам нужен интерфейс для работы с различными процессами, вы можете создать интерфейс для службы с помощью Messenger. Таким образом, служба определяет обработчик, который отвечает на различные типы объектов сообщения. Этот обработчик является основой для Messenger, который затем может делиться IBinder с клиентом, позволяя клиенту отправлять команды службе, используя объекты Message. Кроме того, клиент может определить собственный мессенджер, чтобы служба могла отправлять сообщения обратно.
Это самый простой способ выполнения межпроцессного взаимодействия (IPC), потому что Messenger помещает все запросы в один поток, так что вам не нужно разрабатывать свой сервис для обеспечения безопасности потоков.