从ResolveInfo从另一个Apk启动服务

时间:2014-07-11 18:49:20

标签: android android-intent android-service android-service-binding

我正在创建一个应用程序,通过使用以下内容读取每个具有与自定义操作匹配的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个方法。

1 个答案:

答案 0 :(得分:1)

我认为你不能那样做。

您绑定到其他进程中的服务 。无法获得对实际LocalBinder实例的引用,因为进程无法共享对象实例。


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

  

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

     

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