ClassCastException при привязке к локальной службе из другого Activity - PullRequest
1 голос
/ 24 декабря 2010

В моем приложении у меня есть два отдельных APK. Операция (A1) из первого APK запускает локальную службу и может вызывать методы, предоставляемые этой службой. Позже действие A1 начинает другое действие (A2) со второго APK. Операция A2 пытается подключиться к локальной службе, запущенной A1. Оба действия выполняются в одном и том же процессе с одним и тем же SharedUserID. Интерфейс службы предоставляется, как показано в примерах API LocalService. Метод сервиса onBind возвращает экземпляр LocalBinder, который имеет метод getService (). Когда onServiceConnected из A2 вызывается, я получаю ClassCastException, когда пытаюсь привести из IBinder к MyService.LocalBinder.

В отладчике я вижу, что аргумент службы onServiceConnected действия A2 является правильным экземпляром MyService.LocalBinder. Я даже могу наблюдать все атрибуты MyService в отладчике, но когда я пытаюсь привести сервис IBinder к MyService.LocalBinder, я получил исключение ClassCastException? Есть ли способ обойти или мне нужно использовать AIDL?

public void onServiceConnected(ComponentName className, IBinder service)
{

  try
  {
       MyService.LocalBinder binder = (MyService.LocalBinder)service;
       m_IService = binder.getService();
  }
  catch(ClassCastException e)
  {

  }


 }

1 Ответ

0 голосов
/ 24 декабря 2010

Не уверен насчет этого, но я предполагаю, что вы скомпилировали MyService.LocalBinder в apk A1 и A2. Это породило бы такого рода исключения, потому что, хотя они имеют одинаковое имя и код, они по-прежнему являются двумя отдельными файлами классов. Я думаю, что вам нужно переместить класс в общую библиотеку, чтобы эта работа работала.


Обновление (отвечая на комментарий): я не вижу, как использование интерфейса будет отличаться; как и в случае с классом, интерфейс будет реализован по-разному на клиенте и сервере, что приведет к исключению приведения. Возможно, вы сможете использовать отражение , чтобы обойти это, но я не рекомендую такой подход - он может не поддерживаться ни AndroidOS, ни DalvikVM.

Я думаю, что лучший способ - это попытаться создать интерфейс AIDL и посмотреть, справится ли он с работой. Это может быть в 10 раз легче, чем пытаться сделать что-то, что Android, похоже, намеренно предотвращает.

Но если вы хотите продолжать следовать своему текущему подходу, один из возможных путей будет использовать ClassLoader для загрузки клиентского класса на сервер. Я не уверен, что это тоже можно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...