Android 绑定到实现接口的服务
编辑:已编辑以下代码以显示问题的正确解决方案。 我有一个应用程序,它使用前台服务来执行网络操作 目前,前台服务使用蓝牙连接来执行操作。我正在尝试实现一个新版本的服务,它使用wifi代替,并允许用户通过共享偏好来决定是使用蓝牙还是wifi 我已经实现了wifi服务,现在我需要绑定到它。我创建了一个接口,Android 绑定到实现接口的服务,android,android-service,Android,Android Service,编辑:已编辑以下代码以显示问题的正确解决方案。 我有一个应用程序,它使用前台服务来执行网络操作 目前,前台服务使用蓝牙连接来执行操作。我正在尝试实现一个新版本的服务,它使用wifi代替,并允许用户通过共享偏好来决定是使用蓝牙还是wifi 我已经实现了wifi服务,现在我需要绑定到它。我创建了一个接口,MyService,它定义了两个版本的服务所需的所有方法。但是,当我尝试绑定到活动中的服务时,我得到一个ClassCastException错误 以下是我的服务界面的相关部分: MyService.
MyService
,它定义了两个版本的服务所需的所有方法。但是,当我尝试绑定到活动中的服务时,我得到一个ClassCastException
错误
以下是我的服务界面的相关部分:
MyService.java:
public interface MyService {
// constants
...
// method declarations
...
public interface LocalBinder {
MyService getService(Handler handler);
}
}
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;
}
}
以下是两个版本服务中的相关方法:
MyBluetoothService.java:
public interface MyService {
// constants
...
// method declarations
...
public interface LocalBinder {
MyService getService(Handler handler);
}
}
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;
}
};
MyService-mChatService=null;
...
专用ServiceConnection mConnection=新ServiceConnection(){
@凌驾
ServiceConnected上的公共无效(ComponentName类名称,
IBinder服务){
//我们已经绑定到MyService,抛出IBinder并获取MyService实例
LocalBinder=(LocalBinder)服务;我假设它抛出的代码是MyService.LocalBinder类,而不是MyBluetoothService.LocalBinder类
我认为您要做的是定义MyBluetoothService.LocalBinder类以从MyService.LocalBinder类扩展而来
e、 g
你的思路是对的。我编辑了我的问题以显示有效的解决方案……我必须在MyService
接口中将LocalBinder
声明为嵌套接口。然后,对于MyBluetoothService.java
中LocalBinder
的实际声明,我必须实现MyService.LocalBinder
。