我正在创建一个应用程序,通过使用以下内容读取每个具有与自定义操作匹配的IntentFilter的服务:
Intent intent = new Intent(ACTION);
List<ResolveInfo> infos = getActivity().getPackageManager()
.queryIntentServices(intent, 0);
检索服务没有问题,但是当我尝试将它们绑定到当前的Activity时,我的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);
}
我想要做的是能够从其他人的LocalService实现中调用最后2个方法。
答案 0 :(得分:1)
我认为你不能那样做。
您绑定到其他进程中的服务 。无法获得对实际LocalBinder
实例的引用,因为进程无法共享对象实例。
我自己没有测试过这种情况,但根据documentation,如果您需要IPC for Services,您有两种选择,Messenger或AIDL。第一个似乎更简单。
如果您需要界面在不同的流程中工作,您可以 使用Messenger为服务创建一个界面。以这种方式, 该服务定义了一个响应不同类型的处理程序 消息对象。这个Handler是Messenger的基础 然后与客户共享IBinder,允许客户端发送 使用Message对象命令服务。另外, 客户端可以定义自己的Messenger,以便服务可以发送 消息回来。
这是执行进程间通信(IPC)的最简单方法, 因为Messenger将所有请求排队到一个线程中 您不必将服务设计为线程安全的。