java.lang.ClassCastException:android.os.BinderProxy无法强制转换为xxx $ LocalBinder

时间:2016-03-02 15:50:42

标签: java android service

我正在实现一个服务,并且在本地绑定它的服务之上有一个包装类。现在,当我将服务作为jar导出并从另一个应用程序链接到它时(此应用程序实例化包装类)。 当我运行应用程序时,我得到ClassCastException:android.os.BinderProxy无法转换为xxx $ LocalBinder 由包装类中的本地绑定引起:

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

这里的活页夹是BinderProxy类型而不是localbinder,因此崩溃。

此应用程序工作的唯一方法是当应用程序的包名称与服务包名称相同时(我假设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的主应用程序中,如果设置包名称

<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 个答案:

答案 0 :(得分:3)

请参阅this

如果您的服务仅由本地应用程序使用,并且不需要跨进程工作,那么您可以实现自己的Binder类,使您的客户端可以直接访问服务中的公共方法。

  

注意:仅当客户端和服务相同时才有效   应用程序和流程,这是最常见的。例如,这会   适用于需要绑定活动的音乐应用程序   它自己的服务是在后台播放音乐。