3

我有几个Android Service,我想绑定在我的Activity,所以我可以监视用户的几个动作。是否需要为每个服务绑定一个ServiceConnection?

为了能够绑定每个服务,并且我将有几个,我需要几个私人的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; 
    } 
}; 

或者我需要在我的活动和服务之间提供更好的使用和理解有界服务的经理类吗?

回答

1

是否需要为每个android 服务提供一个serviceConnection?

我假设你问你是否可以重复使用同一serviceConnection多个服务。没有必要为每个服务连接都有一个,但这可能是最好的方法。我看到你的代码这个

 GPSLocalBinder gpsBinder = (GPSLocalBinder) service; 
     PhotoLocalBinder photoBinder = (PhotoLocalBinder) service; 
     gpsService = gpsBinder.getService(); 
     photoService = photoBinder.getService(); 

这是非常混乱......这似乎是可以转换成两个不同的服务的服务!

你会意识到,onServiceConnected回调是大多数魔术发生的地方,你(Activity)最终可以得到一个指向你的服务的指针并开始调用方法并与你的服务进行交互。如果您想为不同的服务重复使用相同的serviceConnection,您需要找出IBinder对象属于哪个自定义子类,然后进行适当的转换。 Ufff,太麻烦了。我建议每个服务有一个serviceConnection

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

对于这个和你的第一个问题,你可以做任何你想做的事情。没有比其他方法更好的方法(恕我直言),最好的方法是你更好地理解并让你感觉更舒适的方法。

+0

Thx为您在这个问题上的启示。 – JoaoFilipeClementeMartins

0

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

ServiceConnection.onServiceConnected(),你就必须检查哪个服务被结合(使用className.getClassName()className.getPackageName()),并把它在相应的字段/变量等

我用this thread作为参考,虽然我改性它以符合我的需求。

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; 
     } 
    } 
} 
相关问题