android 不依靠aidl,自己实现Binder间通信

依靠aidl编写Binder间的通信,确实很方便,只要写好接口,Android Studio编译一下,就会在Project目录->app->generated->source->aidl->debug->包名目录下自动生成代码。为了加深理解,本文决定自己手动实现Binder客户端和服务端的通信,参考了android开发艺术探索这本书籍。

先开始编写服务端,首先自定义一个接口,这个接口继承自IInterface,接着声明一个函数,提供给客户端调用,并且给这个函数定义一个ID。

public interface ICalculationManager extends IInterface {
    private static final int TRANSACTION_doCalculate = (IBinder.FIRST_CALL_TRANSACTION + 0);
    double doCalculate(double a, double b) throws RemoteException;
}

在客户端绑定服务端的时候,会调用Server的onBind,我们需要返回一个Binder对象,并要实现声明的函数。

public class MyServer extends Service {
    private static final String TAG = "MyServer";
    private final ICalculationManager.Stub  mBinder = new ICalculationManager.Stub() {
        @Override
        public double doCalculate(double a, double b) {
            return a + b;
        }
    };

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind: ");
        return mBinder;
    }
}

现在可以实现Stub,Stub继承Binder类并实现了接口ICalculationManager,增加了DESCRIPTOR,实现了Stub的构造函数。最重要的是onTransact这个函数,这个函数用来处理客户端要调用的函数和传来的参数,并将结果返回。来看它的第一个参数code,code指的就是函数的ID,通过客户端发过来的id,来决定调用哪个函数。第二个参数data,就是客户端传过来的参数。第三个参数reply用来存放返回结果。这里onTransact里用根据code里的id号switch语句中对应分支,首先从data中读出参数,再经过this.doCalculate的计算,得到结果,写到reply中,this.doCalculate实现就是我们在MyServer中重写的doCalculate。还有其中的asBinder返回的是当前Binder对象,这里就是返回Stub对象。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值