我绑定到服务,具有我的自定义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
,但给我错误的活页夹?
编辑2
因此,我可以在Messenger(service)
内致电onServiceConnected
并通过消息进行交流。而且有效。为什么不能将IBinder
投射到活页夹中?我现在无法更改应用程序并使用消息。我需要活页夹。