绑定到服务时出现Android ClassCast异常

绑定到服务时出现Android ClassCast异常,android,binding,service,android-activity,classcastexception,Android,Binding,Service,Android Activity,Classcastexception,好的,我是android开发的新手,正在尝试绑定到一个服务,以便在服务启动后可以调用该服务的方法。下面描述的活动和服务都是同一应用程序的一部分,因此不会出现任何问题,但每次运行应用程序时,我都会出现以下错误: java.lang.ClassCastException:android.os.BinderProxy 发生这种情况的线路是: LocalBinder binder = (LocalBinder) service; 我的活动代码(简化为): 服务: public class GPSSer

好的,我是android开发的新手,正在尝试绑定到一个服务,以便在服务启动后可以调用该服务的方法。下面描述的活动和服务都是同一应用程序的一部分,因此不会出现任何问题,但每次运行应用程序时,我都会出现以下错误:

java.lang.ClassCastException:android.os.BinderProxy

发生这种情况的线路是:

LocalBinder binder = (LocalBinder) service;
我的活动代码(简化为):

服务:

public class GPSService extends Service {

    @Override
    public void onCreate() {
            super.onCreate();
    }

    @Override
    public IBinder onBind(Intent i) {
    // TODO Auto-generated method stub
    return new LocalBinder<GPSService>(this);
    }


   /**
    * Our implementation of LocationListener that handles updates given to us
    * by the LocationManager.
    */
    public class CustomLocationListener implements LocationListener {

        DBHelper db;

        CustomLocationListener() {
            super();
        }

    // Overridden methods here...

    }

}
公共类GPSService扩展服务{
@凌驾
public void onCreate(){
super.onCreate();
}
@凌驾
公共IBinder onBind(意向一){
//TODO自动生成的方法存根
返回新的LocalBinder(此);
}
/**
*我们的LocationListener实现处理提供给我们的更新
*地点经理。
*/
公共类CustomLocationListener实现LocationListener{
dbdb;
CustomLocationListener(){
超级();
}
//这里重写的方法。。。
}
}
最后是我的LocalBinder:

/**
 * A generic implementation of Binder to be used for local services
 * @author Geoff Bruckner  12th December 2009
 *
 * @param <S> The type of the service being bound
 */

public class LocalBinder<S> extends Binder {
    private String TAG = "LocalGPSBinder";
    private  WeakReference<S> mService;


    public LocalBinder(S service){
        mService = new WeakReference<S>(service);
    }


    public S getService() {
        return mService.get();
    }
}
/**
*用于本地服务的绑定器的通用实现
*@作者杰夫·布鲁克纳2009年12月12日
*
*@param要绑定的服务的类型
*/
公共类LocalBinder扩展了Binder{
私有字符串TAG=“LocalGPSBinder”;
私人WeakReference mService;
公共LocalBinder(S服务){
mService=新的WeakReference(服务);
}
公共服务{
返回mService.get();
}
}
我理解ClassCast异常的含义,但不明白该怎么做!我已经在谷歌文档中引用了这个例子,但它仍然不起作用。有人能解释一下是什么导致了这一切吗


提前谢谢

在ServiceConnected上传入的LocalBinder具有泛型类型参数,而您的局部变量
LocalBinder
没有泛型类型参数

通过从LocalBinder的定义中删除泛型类型,或在OnServiceConnectiond中向局部变量binder的声明中添加泛型类型,以这种或那种方式解决此问题

class MyBoundService extends Service{
    private final IBinder mBinder = new MyBinder();

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    public class MyBinder extends Binder{

        public void doStuff(){
            //Stuff
        }
        //More Binder Methods
    }
}

class MyActivity extends Activity{
    private MyBinder mBinder;

    @Override
    protected void onStart(){
        Intent intent = new Intent(this, MyBoundService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop(){
        unbindService(mConnection);
    }

    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
            mBinder = (TaskBinder) service;
            mBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            mBound = false;
        }
    };

    private void doStuff(){
        if (mBound)
            mBinder.doStuff();
    }
}
没有真正的需要去摆弄弱引用之类的东西。一定要解开(我没有在样本中)


如果您想尽快调用服务方法,只需在设置mBinder后将调用放入onServiceConnected即可。否则,只需从其他回调调用(onClick events等)。

如果您试图绑定到本地服务,而不是yes,则可以强制转换它。但是,如果您试图绑定到远程(单独的进程)服务,则必须使用本文中规定的AIDL方法


删除服务的AndroidManifest.xml中的属性
过程

也有相同的错误。我在清单中添加了android:process=“:process_description”属性。当您添加它时,您的服务被创建为单独的进程,因此您得到binderProxy的实例(因此类cast异常)

您的意思是:‘LocalBinder=(LocalBinder)service;’如果是这样,仍然会出现相同的错误!我倾向于完全去掉仿制药。我将编辑一个我正在编写的boundService使用的快速示例。我将自己尝试一下,不使用泛型,但如果你能给出一个示例,那将是非常棒的!谢谢,JamesThat应该这样做(除非你真的需要IBinder中的泛型,这会有点奇怪))。您不需要在onStart/onStop中绑定/解除绑定。onCreate/onDestroy也可以正常工作,但您可能应该避免onResume/onPause,因为它们被调用的次数太多。仍然没有运气。您还有其他建议吗?好奇,有详细的原因吗?@ThomasDecaux我相信这是因为只有当服务与应用程序在同一进程(本地)中运行时,才可以使用LocalBinder。process属性为服务创建一个单独的进程来运行,因此,您必须使用IPC与之通信。在绑定过程中,Android为您提供了一个BinderProxy作为服务的桥梁,以便您可以实例化IPC类(用AIDL编写)。这是一根旧线,但这只救了我一命!接得好!事实上,你在没有OP发布他明显的天才的情况下就发现了这一点。谢谢如果我需要处理一个单独的流程,那么正确的方法是什么呢
class MyBoundService extends Service{
    private final IBinder mBinder = new MyBinder();

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    public class MyBinder extends Binder{

        public void doStuff(){
            //Stuff
        }
        //More Binder Methods
    }
}

class MyActivity extends Activity{
    private MyBinder mBinder;

    @Override
    protected void onStart(){
        Intent intent = new Intent(this, MyBoundService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop(){
        unbindService(mConnection);
    }

    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
            mBinder = (TaskBinder) service;
            mBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            mBound = false;
        }
    };

    private void doStuff(){
        if (mBound)
            mBinder.doStuff();
    }
}