Android 每个服务绑定是否需要一个ServiceConnection?

Android 每个服务绑定是否需要一个ServiceConnection?,android,android-service,android-service-binding,serviceconnection,Android,Android Service,Android Service Binding,Serviceconnection,我有几个安卓服务s,我想在我的活动中绑定它们,因此我可以监视用户的几个操作 为了能够绑定每个服务,并且我将拥有多个服务,我是否需要在我的活动中使用多个私有ServiceConnections,如下所示 /** Defines callbacks for service binding, passed to bindService() */ private ServiceConnection mConnection = new ServiceConnection() { @Overrid

我有几个安卓
服务
s,我想在我的
活动
中绑定它们,因此我可以监视用户的几个操作

为了能够绑定每个服务,并且我将拥有多个服务,我是否需要在我的活动中使用多个私有
ServiceConnection
s,如下所示

/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className,
            IBinder service) {
        // We've bound to LocalService, cast the IBinder and get LocalService instance
        GPSLocalBinder gpsBinder = (GPSLocalBinder) service;
        PhotoLocalBinder photoBinder = (PhotoLocalBinder) service;
        gpsService = gpsBinder.getService();
        photoService = photoBinder.getService();
        mGpsBound = true;
        mPhotoBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mGpsBound = false;
        mPhotoBound = false;
    }
};
或者我是否需要在我的活动和服务之间建立一个manager类,以便更好地使用和理解受限服务

每个android是否需要一个serviceConnection 服务

我假设您正在询问是否可以对多个服务重用相同的
serviceConnection
。没有必要为每个服务连接设置一个,但这可能是最好的方法。我在你的代码中看到了这一点

        GPSLocalBinder gpsBinder = (GPSLocalBinder) service;
        PhotoLocalBinder photoBinder = (PhotoLocalBinder) service;
        gpsService = gpsBinder.getService();
        photoService = photoBinder.getService();
这是非常令人困惑的。。。这似乎可以将一个服务转换为两个不同的服务

您将认识到,
onServiceConnected
回调是最神奇的地方,在这里您(活动)最终可以获得指向服务的指针,开始调用方法并与服务交互。如果要将相同的
serviceConnection
重新用于不同的服务,则需要找出IBinder对象所属的自定义子类,然后进行适当的强制转换。啊,太麻烦了。我建议每个服务有一个
serviceConnection

或者我需要在我的活动和提供的服务之间设置一个经理类 更好地使用和理解有界服务


对于这个问题和你的第一个问题,你可以做任何你想做的事情。没有比另一种(IMHO)更好的方法了,最好的方法是您更了解并感觉更舒适的方法。

单个
ServiceConnection
实例可用于绑定到多个服务

ServiceConnection.onServiceConnected()
中,您必须检查绑定了哪个服务(使用
className.getClassName()
className.getPackageName()
),并将其放入相应的字段/变量中,等等

我用它作为参考,尽管我修改了它以满足我的需要

private static final int SERVICE_1_INDEX = 0;
private static final int SERVICE_2_INDEX = 1;

/** Array of the subclasses of {@link BaseService}s which have been bound */
private BaseService[] mServices;
/** ServiceConnection which handles the binding/unbinding of the services */
private MyServiceConnection mServiceConnection;

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mServiceConnection = new MyServiceConnection();
}

@Override
public void onResume() {
    super.onResume();
    bindServices();
}

@Override
public void onPause() {
    super.onPause();
    unbindServices();
}

private void bindServices() {
    Intent service1Intent = new Intent(getActivity().getApplicationContext(), MyService1.class);
    Intent service2Intent = new Intent(getActivity().getApplicationContext(), MyService2.class);

    getContext().bindService(service1Intent, mServiceConnection, Context.BIND_AUTO_CREATE);
    getContext().bindService(service2Intent, mServiceConnection, Context.BIND_AUTO_CREATE);
}

private void unbindServices() {
    if (mServiceConnection != null) {
        getContext().unbindService(mServiceConnection);
    }
}

private class MyServiceConnection implements ServiceConnection {
    public void onServiceConnected(ComponentName className, IBinder boundService ) {
        Log.d("className(bound)", className.getClassName());
        Log.d("className(Service1)", MyService1.class.getName());
        Log.d("className(Service2)", MyService2.class.getName());
        BaseService.LocalBinder binder = (BaseService.LocalBinder) boundService;
        if (className.getClassName().equals(MyService1.class.getName())) {
            mServices[SERVICE_1_INDEX] = binder.getService();
            // call method on your service like:
            // binder.getService().someMethod();
            // (you may need to cast to your actual Service)
        }
        else {
            mBaseServices[SERVICE_2_INDEX] = binder.getService();
            // call method on the service like in if-block
        }
    }

    public void onServiceDisconnected(ComponentName className) {
        if (className.getClassName().equals(MyService1.class.getName())) {
            mBaseServices[SERVICE_1_INDEX] = null;
        }
        else {
            mBaseServices[SERVICE_2_INDEX] = null;
        }
    }
}

谢谢你对这个问题的启示。