代码之家  ›  专栏  ›  技术社区  ›  anon

使用服务时ClassCastException

  •  3
  • anon  · 技术社区  · 14 年前

    我定义了一个本地服务:

    public class ComService extends Service implements IComService {
        private IBinder binder = new ComServiceBinder();
    
        public class ComServiceBinder extends Binder implements IComService.IServiceBinder {
            public IComService getService() {
                return ComService.this;
            }
        }
    
        public void test(String msg) {
            System.out.println(msg);
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }    
    }
    

    对应接口:

    public interface IComService {
        public void test(String msg);
    
        public interface IServiceBinder {
            IComService getService();
        }
    }
    

    然后我尝试将服务绑定到另一个应用程序中的另一个活动中,在该活动中可以使用相同的接口:

    bindService(new Intent("ch.ifi.csg.games4blue.gamebase.api.ComService"), conn, Context.BIND_AUTO_CREATE);
    

    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i("INFO", "Service bound " + name);
            comService = ((IComService.IServiceBinder)service).getService();
            serviceHandler.sendEmptyMessage(0);
        }
    
        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            Log.i("INFO", "Service Unbound ");
        }
    };
    

    但是这条线

    comService = ((IComService.IServiceBinder)service).getService();
    

    总是抛出一个

    05-02 22:12:55.922: ERROR/AndroidRuntime(622): java.lang.ClassCastException: android.os.BinderProxy
    

    我无法解释为什么,我在上跟踪了应用程序示例 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceBinding.html

    任何提示都会很好!

    1 回复  |  直到 14 年前
        1
  •  9
  •   CommonsWare    14 年前

    您需要使用aidl定义跨越应用程序的接口(所谓的“远程服务”)。您遵循了本地绑定示例,但没有使用本地绑定。尝试 this this 使用aidl的远程绑定示例的示例项目。