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;
}
}
}
谢谢你对这个问题的启示。