編輯:下面的代碼已被編輯,以顯示問題的正確解決方案。綁定到實現接口的服務
我有一個應用程序,它使用前臺服務來執行網絡操作。
目前,前臺服務使用藍牙連接來執行操作。我試圖實現使用wifi的服務的新版本,並允許用戶決定是否通過共享偏好使用藍牙或WiFi。
我已經實現了wifi服務,現在我需要綁定它。我創建了一個界面,MyService
,它定義了這兩個版本的服務需要的所有方法。但是,當我嘗試綁定到我的活動中的服務時,出現ClassCastException
錯誤。
這裏是我的服務接口的相關部分:
MyService.java:
public interface MyService {
// constants
...
// method declarations
...
public interface LocalBinder {
MyService getService(Handler handler);
}
}
這裏是相關的方法是存在於服務的兩個版本:
MyBluetoothService.java:
public class MyBluetoothService extends Service implements MyService {
private final IBinder mBinder = new LocalBinder();
...
public class LocalBinder extends Binder implements MyService.LocalBinder {
MyService getService(Handler handler) {
mHandler = handler;
// Return this instance of MyService so clients can call public methods
return MyBluetoothService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
Log.w(TAG, "MyBluetoothService bound");
return mBinder;
}
}
MyWifiService.java:
與MyBluetoothService.java
完全相同,除非類名稱根據需要更改。
這裏是我綁定到我的活動的服務:發生
MyService mChatService = null;
...
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
// We've bound to MyService, cast the IBinder and get MyService instance
LocalBinder binder = (LocalBinder)service; <------- ClassCastException
mChatService = binder.getService(mHandler);
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName argo) {
mBound = false;
}
};
的ClassCastException
就行了上述表示。
現在所有這一切都已經結束......是否有可能以這種方式綁定到服務?事實上,每次我從服務中調用一個方法時,我都可以檢查共享偏好,但我寧願不要。
你在正確的軌道上。我編輯了我的問題以顯示工作解決方案......我必須在'MyService'界面中聲明'LocalBinder'作爲嵌套接口。然後,爲了在MyBluetoothService.java中實際聲明'LocalBinder',我必須實現'MyService.LocalBinder'。 – howettl