0

I'm creating an app that reads every Service that has an IntentFilter that matches a custom action by using this:

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

I have no problem retrieving the Services, but when I try to bind them to the current Activity, my IBinder implementation is not passed to onServiceConnected(ComponentName, IBinder). Instead, a BinderProxyis being passed.

How can I get my LocalBinder from that BinderProxy?

EDIT:

Here's my implementation:

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);

}

What I want to do is to be able to call the last 2 methods from other people's implementations of my LocalService.

4

1 回答 1

1

我不认为你能做到这一点。

您正在绑定到不同进程中的服务。不可能获得对您的实际LocalBinder实例的引用,因为进程不能共享对象实例。


我自己没有测试过这种情况,但根据文档,如果您需要 IPC for Services,您有两种选择,一个MessengerAIDL。第一个似乎要简单得多。

如果您需要您的界面跨不同的进程工作,您可以使用 Messenger 为服务创建一个界面。以这种方式,服务定义了一个 Handler 来响应不同类型的 Message 对象。这个 Handler 是 Messenger 的基础,它可以与客户端共享一个 IBinder,允许客户端使用 Message 对象向服务发送命令。此外,客户端可以定义自己的 Messenger,以便服务可以发回消息。

这是执行进程间通信 (IPC) 的最简单方法,因为 Messenger 将所有请求排队到单个线程中,因此您不必将服务设计为线程安全的。

于 2014-07-11T18:54:59.033 回答