Служба Android - android.os.BinderProxy не может быть преобразован в xxx - PullRequest
0 голосов
/ 05 октября 2018
  1. Я знаю, что это задавали несколько раз
  2. Да, я прочитал все другие вопросы / ответы
  3. Нет, ничего не работает

Iпривязываюсь к сервису, имеющему мою собственную реализацию BinderНо когда вызывается onServiceConnected, я не могу привязать IBinder к своему пользовательскому связующему, и оно дает мне:

java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.xxx.xxx.service.XXXService$ServiceBinder

Это мой сервис и связующее:

class XXXService : Service() {
    private val binder = ServiceBinder()

    inner class ServiceBinder : Binder() {
        override fun toString(): String {
            return "My Service Binder"
        }
    }

    override fun onBind(intent: Intent): IBinder? {
        Log.d("test", binder.toString()) // Prints correctly "My Service Binder"
        return binder
    }
}

Вот какЯ связываюсь с сервисом:

val i = Intent(mPluginContext, XXXService::class.java)
mPluginContext.bindService(i, mServiceConnection, Context.BIND_AUTO_CREATE)

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

Вот метод onServiceConnected:

override fun onServiceConnected(className: ComponentName, service: IBinder?) {
    if (service == null) {
        return
    }

    serviceBinder = service as XXXService.ServiceBinder // Crash
}

Это манифест:

<service
    android:name="com.xxx.xxx.XXXService"
    android:exported="true"
    android:label="XXX Service"/>

Без экспортированного атрибута в манифесте он дает мне java.lang.SecurityException: Not allowed to start service

В некоторых ответах SO говорится - вы уверены, что запускаете службу только один раз?- Я поставил журнал в начале onServiceConnected(), и он печатает только один раз.

Раньше эта служба была связана точно так же, но связь осуществлялась с помощью сообщений, а не связующего.

Любые предложенияна что я делаю не так?

РЕДАКТИРОВАТЬ

Хитрая часть - mPluginContext.Если я запускаю новое действие в плагине и использую контекст действия, оно работает просто отлично.Все еще остается вопрос, почему контекст позволил мне связать сервис, вызвал onServiceConnected, но дал мне неправильный Binder?

РЕДАКТИРОВАТЬ 2

Итак, яМожно звонить Messenger(service) внутри onServiceConnected и общаться через сообщения.И это работает.Почему я не могу бросить IBinder на свой переплет?Я не могу изменить приложение сейчас и использовать сообщения.Мне нужно переплет.

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