绑定到实现接口的服务

时间:2011-07-27 00:07:18

标签: android android-service

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

我有一个使用前台服务执行网络操作的应用程序。

目前,前台服务使用蓝牙连接来执行操作。我正在尝试使用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出现在上面指定的行上。

既然所有这一切都已经解决了......是否有可能以这种方式绑定到服务?另外,我每次从服务中调用方法时都可以检查共享首选项,但我不愿意。

1 个答案:

答案 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;
}
}