- Я знаю, что это задавали несколько раз
- Да, я прочитал все другие вопросы / ответы
- Нет, ничего не работает
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
на свой переплет?Я не могу изменить приложение сейчас и использовать сообщения.Мне нужно переплет.