Android服务-android.os.BinderProxy无法转换为xxx

时间:2018-10-04 21:39:24

标签: android service kotlin

  1. 我知道这已被问过多次
  2. 是的,我阅读了所有其他问题/答案
  3. 不,没有任何作用

我绑定到服务,具有我的自定义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投射到活页夹中?我现在无法更改应用程序并使用消息。我需要活页夹。

0 个答案:

没有答案