编辑:以下代码已经过编辑,以显示问题的正确解决方案。
我有一个使用前台服务执行网络操作的应用程序。
目前,前台服务使用蓝牙连接来执行操作。我正在尝试使用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 :(得分:0)
我假设它抛出的代码是MyService.LocalBinder类而不是MyBluetoothService.LocalBinder类?
我认为你打算做的是定义MyBluetoothService.LocalBinder类以从MyService.LocalBinder类扩展?
e.g。
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;
}
}