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; 
     } 
    } 
} 
相關問題