2011-07-27 134 views
1

編輯:下面的代碼已被編輯,以顯示問題的正確解決方案。綁定到實現接口的服務

我有一個應用程序,它使用前臺服務來執行網絡操作。

目前,前臺服務使用藍牙連接來執行操作。我試圖實現使用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就行了上述表示。

現在所有這一切都已經結束......是否有可能以這種方式綁定到服務?事實上,每次我從服務中調用一個方法時,我都可以檢查共享偏好,但我寧願不要。

回答

0

我假設它拋出的代碼是MyService.LocalBinder類而不是MyBluetoothService.LocalBinder類?

我想你要做的是定義MyBluetoothService.LocalBinder類從MyService.LocalBinder類擴展?

例如

public class MyBluetoothService extends Service implements MyService { 

private final IBinder mBinder = new LocalBinder(); 

... 

public class LocalBinder extends 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; 
} 
} 
+0

你在正確的軌道上。我編輯了我的問題以顯示工作解決方案......我必須在'MyService'界面中聲明'LocalBinder'作爲嵌套接口。然後,爲了在MyBluetoothService.java中實際聲明'LocalBinder',我必須實現'MyService.LocalBinder'。 – howettl