Android 绑定到实现接口的服务

Android 绑定到实现接口的服务,android,android-service,Android,Android Service,编辑:已编辑以下代码以显示问题的正确解决方案。 我有一个应用程序,它使用前台服务来执行网络操作 目前,前台服务使用蓝牙连接来执行操作。我正在尝试实现一个新版本的服务,它使用wifi代替,并允许用户通过共享偏好来决定是使用蓝牙还是wifi 我已经实现了wifi服务,现在我需要绑定到它。我创建了一个接口,MyService,它定义了两个版本的服务所需的所有方法。但是,当我尝试绑定到活动中的服务时,我得到一个ClassCastException错误 以下是我的服务界面的相关部分: MyService.

编辑:已编辑以下代码以显示问题的正确解决方案。

我有一个应用程序,它使用前台服务来执行网络操作

目前,前台服务使用蓝牙连接来执行操作。我正在尝试实现一个新版本的服务,它使用wifi代替,并允许用户通过共享偏好来决定是使用蓝牙还是wifi

我已经实现了wifi服务,现在我需要绑定到它。我创建了一个接口,
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