文章开头也说到服务端的Binder实例会根据客户端依靠Binder驱动发来的消息,执行onTransact方法,然后由其参数决定执行服务端的代码。
可以看到onTransact有四个参数 code , data ,replay , flags code 是一个整形的唯一标识,用于区分执行哪个方法,客户端会传递此参数,告诉服务端执行哪个方法 data客户端传递过来的参数 replay服务器返回回去的值 flags标明是否有返回值,0为有(双向),1为没有(单向) 我们仔细看case TRANSACTION_min中的代码 data.enforceInterface(DESCRIPTOR);与客户端的writeInterfaceToken对用,标识远程服务的名称 int _arg0;
_arg0 = data.readInt();
int _arg1;
_arg1 = data.readInt();
接下来分别读取了客户端传入的两个参数 int _result = this.min(_arg0, _arg1);
reply.writeNoException();
reply.writeInt(_result);
然后执行this.min,即我们实现的min方法;返回result由reply写回。 add同理,可以看到服务端通过AIDL生成Stub的类,封装了服务端本来需要写的代码。 2、客户端客户端主要通过ServiceConnected与服务端连接
[java] view plain copy
- private ServiceConnection mServiceConn = new ServiceConnection()
- {
- @Override
- public void onServiceDisconnected(ComponentName name)
- {
- Log.e("client", "onServiceDisconnected");
- mCalcAidl = null;
- }
-
- @Override
- public void onServiceConnected(ComponentName name, IBinder service)
- {
- Log.e("client", "onServiceConnected");
- mCalcAidl = ICalcAIDL.Stub.asInterface(service);
- }
- };
|