РЕДАКТИРОВАТЬ: код ниже был отредактирован, чтобы показать правильное решение проблемы.
У меня есть приложение, которое использует службу переднего плана для выполнения сетевых операций.
В настоящее время служба переднего плана использует соединение Bluetooth для выполнения операций.Я пытаюсь внедрить новую версию сервиса, которая вместо этого использует Wi-Fi, и позволяет пользователю решать, использовать ли Bluetooth или Wi-Fi через общие настройки.
Я реализовал сервис Wi-Fi, и теперь янужно привязать к нему.Я создал интерфейс 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
происходит в строке, указанной выше.
Теперь, когда все это за пределами пути ... возможно ли привязать к сервису таким образом?Кроме того, я всегда мог проверять общие предпочтения каждый раз, когда вызываю метод из службы, но я бы предпочел этого не делать.