Мы привязываемся к нашей локальной службе (тот же процесс) в подклассе Application, но иногда мы получаем ClassCastException. Я понятия не имею, как это исправить, поскольку все говорят, что исключение возникает, если процесс обслуживания отличается от вашего приложения. Как это можно исправить?
Подкласс приложения:
public class App extends Application implements ServiceConnection {
private ServiceApi exposedServiceApi;
private EventBus eventBus;
@Override public void onCreate() {
super.onCreate();
bindToService();
}
public void bindToService() {
if (isConnectedToService()) {
return;
}
boolean successfulBindCall =
bindService(new Intent(this, MainService.class), this, BIND_IMPORTANT | BIND_AUTO_CREATE);
if (successfulBindCall) {
Timber.d("bindService() returned true --> onServiceConnected() will be called soon.");
} else {
throw new RuntimeException("bindService() returned false, this is an unrecoverable state.");
}
}
@Override public void onServiceConnected(ComponentName componentName, IBinder service) {
Timber.d("App has connected to service %s", componentName.toShortString());
if (componentName.getClassName().equals(MainService.class.getName())) {
try {
exposedServiceApi = (ServiceApi) service;
eventBus.post(new MainServiceConnectedEvent());
} catch (ClassCastException e) {
Timber.e(e, "Could not cast IBinder to ServiceApi!");
exposedServiceApi = null;
}
}
}
@Override public void onServiceDisconnected(ComponentName componentName) {
Timber.d("App has disconnected from service %s", componentName.toShortString());
if (componentName.getClassName().equals(MainService.class.getName())) {
exposedServiceApi = null;
eventBus.post(new MainServiceDisconnectedEvent());
}
}
}
Service.onBind():
@Override public IBinder onBind(Intent intent) {
return new ServiceBinder();
}
ServiceBinder: (внутренний класс MainService)
private class ServiceBinder extends Binder implements ServiceApi {
// implementation of ServiceApi
}
Манифест:
<service
android:name=".service.MainService"
android:exported="false"
android:icon="@drawable/ic_launcher"
android:stopWithTask="true"/>
Ошибка:
java.lang.ClassCastException: android.os.BinderProxy не может быть приведен к ee.mtakso.driver.service.ServiceApi в ee.mtakso.App.onServiceConnected(App.java:152) в android.app.LoadedApk$ServiceDispatcher.doConnected( LoadedApk.java:1139) в android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1156) в android.os.Handler.handleCallback(Handler.java:725) в android.os.Handler.dispatchMessage(Handler .java:92) в android.os.Looper.loop(Looper.java:153) в android.app.ActivityThread.main(ActivityThread.java:5341) в java.lang.reflect.Method.invokeNative(Method.java) в java.lang.reflect.Method.invoke(Method.java:511) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:929) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:696) в dalvik.system.NativeStart.main(NativeStart.java)
onBind()
в вашем сервисе. - person David Wasser   schedule 02.07.2015android:process
для каких-либо компонентов в вашем манифесте? - person David Wasser   schedule 02.07.2015onCreate()
вызывается из вашего пользовательского классаApplication
всякий раз, когда Android создает новый процесс для вашего приложения. - person David Wasser   schedule 03.07.2015