Приведение IBinder *иногда* приводит к ClassCastException при привязке к сервису

Мы привязываемся к нашей локальной службе (тот же процесс) в подклассе 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)


person Nima G    schedule 02.07.2015    source источник
comment
Почтовый индекс от onBind() в вашем сервисе.   -  person David Wasser    schedule 02.07.2015
comment
Есть ли в вашем приложении другие сервисы?   -  person David Wasser    schedule 02.07.2015
comment
На каком устройстве вы видите эти ошибки?   -  person David Wasser    schedule 02.07.2015
comment
Извините за все вопросы. Привязываетесь ли вы к каким-либо другим службам (внешним службам), используя глобальный контекст приложения?   -  person David Wasser    schedule 02.07.2015
comment
@DavidWasser у каждого устройства одна и та же проблема (LG g3, nexus 5, sony z3 и т. д.). Я не привязываюсь к какой-либо другой службе явно, но есть Crashlytics, LeakCanary и Google Analytics, которые запускаются в контексте приложения.   -  person Nima G    schedule 02.07.2015
comment
@DavidWasser Но, поскольку я проверяю имя компонента перед кастингом, это не должно быть причиной.   -  person Nima G    schedule 02.07.2015
comment
Кажется, я знаю, в чем проблема. Тем не менее, я хочу сначала провести некоторое тестирование, чтобы дать вам четкий ответ. Я могу сделать это позже сегодня вечером. Извините за задержку.   -  person David Wasser    schedule 02.07.2015
comment
@DavidWasser Большое спасибо, с нетерпением жду вашего ответа. :)   -  person Nima G    schedule 02.07.2015
comment
Арх. Не получил ожидаемых результатов. У вас установлен атрибут android:process для каких-либо компонентов в вашем манифесте?   -  person David Wasser    schedule 02.07.2015
comment
@DavidWasser нет, но у меня есть несколько действий, которые запускаются с контекстом службы и NEW_TASK | CLEAR_TASK, не уверен, что это вообще имеет значение.   -  person Nima G    schedule 03.07.2015
comment
Нет, это не должно иметь значения. Я надеялся, что этот ответ прольет свет на проблему. Однако я создал тестовую программу для проверки своей гипотезы и не смог воспроизвести проблему. Даже если я привязывался к другой службе, работающей в другом процессе, попытка привязки к локальной службе всегда возвращала правильный локальный связыватель. В общем, мне не нравится ваша архитектура, так как onCreate() вызывается из вашего пользовательского класса Application всякий раз, когда Android создает новый процесс для вашего приложения.   -  person David Wasser    schedule 03.07.2015
comment
... лучше было бы, чтобы вы инициировали привязку к службе из действия, даже если вы используете контекст приложения для выполнения привязки. Однако я не думаю, что это решит вашу проблему. К сожалению, у меня закончились идеи :-(   -  person David Wasser    schedule 03.07.2015
comment
Если можете, опубликуйте весь свой манифест. Может быть, я увижу что-то там.   -  person David Wasser    schedule 03.07.2015
comment
Вы когда-нибудь решали эту проблему? Я понимаю, что прошел год, мне интересно, поняли ли вы это когда-нибудь.   -  person David Wasser    schedule 20.07.2016