2016-03-02 2 views
2

Я реализую службу и имею класс оболочки поверх этой службы, локально привязанной к ней. Теперь, когда я экспортирую службу как банку и ссылаюсь на нее из другого приложения (это приложение создает экземпляр класса оболочки). При запуске приложения, я получаю ClassCastException: android.os.BinderProxy не может быть приведен к ххх $ LocalBinder , вызванные локальной привязки в классе обертке:

service = ((LocalBinder) binder).getService(); 

Связующее здесь типа BinderProxy вместо локального замка и, следовательно, аварии.

Единственным способом, с которым работает это приложение, является то, что имя пакета приложения совпадает с именем пакета услуг (я предполагаю, что android считает, что служба является локальной).

private final IBinder localBinder = new LocalBinder(); 
    public class LocalBinder extends Binder { 
    xxxService getService() { 
     return xxxService.this; 
    } 
} 

и

public IBinder onBind(Intent intent) { 
    IBinder result = null; 
    result = localbinder; 
    return result; 
} 

Тогда в моем классе обертке onServiceConnected:

public void onServiceConnected(ComponentName name, IBinder binder) { 

     xxxService = ((LocalBinder) binder).getService(); 

Наконец мой обертка конструктор класса:

public xxxServiceManager(Context context) throws Exception { 
    this.context = context; 
    xxxServiceManagerIntent = new Intent("providerAPI"); 
    xxxServiceManagerIntent.setClassName("com.yyy", "com.yyy.xxxService"); 

    context.startService(xxxServiceManagerIntent); 


    context.bindService(xxxServiceManagerIntent, serviceConnection, Context.BIND_AUTO_CREATE); 

Затем в главном приложении, которое использует этот jar, если yo u установить имя пакета

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.yyy.provider" //the same as the service (which does not make sense) 

все работает, но, очевидно, я хочу установить другое имя пакета. Есть ли способ редизайна или сделать эту работу?

спасибо!

+1

Дополнительный код будет полезен. Ваш сервис (особенно метод 'onBind()' и ваш класс 'LocalBinder') и ваш код привязки могут показать многое о причине проблемы. –

+0

Было бы лучше добавить свой код к исходному вопросу. Это было бы более читаемым, и вам не нужно будет беспокоиться о лимите символов для комментариев. –

+0

Надеюсь, теперь станет ясно. Спасибо за помощь! –

ответ

3

см this

Если ваш сервис используется только при местном применении и не должен работать в различных процессах, то вы можете реализовать свой собственный класс Binder, который обеспечивает ваш клиент прямой доступ к государственным методам обслуживания.

Примечание: Это работает только в том случае, если клиент и служба находятся в том же приложении и процессе , что является наиболее распространенным явлением. Например, это будет хорошо работать для музыкального приложения, которое должно привязать деятельность к своей собственной службе, которая играет музыку в фоновом режиме.

Смежные вопросы