谈谈我对Android中Aidl通信的理解

首先当客户端BindService的时候,服务器端会先执行onCreate方法,在onCreate中执行了添加Book信息的操作,接着继续执行onBind,它返回一个Binder对象,这个对象的实现是通过IBookManager.Stub实现的,由此可知这个Stub就是一个Binder,当然看代码也可以看得出:public static abstract class Stub extends android.os.Binder implements com.games.lwp.aidltest.IBookManager,继承自Binder,implements 了IBookManager,但是自身并没有实现。自然自身就会是一个Binder,然后在客户端的ServiceConnection中就可以通过IBookManager.Stub.asInterface(service)得到aidl接口,这个service就是服务器在onBind中返回的IBinder,然后就能通过这个接口调用服务器端的方法,实现通信。到这里我们可以看出,客户端和服务器端的通信都是通过IBookManager.aidl生成的IBookManager.class接口进行操作的。其中我有一个疑惑得地方就是,虽然IBookManager.Stub类实现了IBookManager接口,但是它并没有自己实现IBookManager接口中的方法,而是通过proxy实现,当服务器端调用IBookManager.Stub方法,那么它就要实现接口的两个方法,当客户端调用调用IBookManager.Stub.asInterface(Binder),此时就会在asInterface里判断客户端和服务器端是否位于一个进程(queryLocalInterface),如果是则直接返回服务器端的aidl接口,通过这个接口调用服务器端实现的这两个方法,如果不是,则返回代理类对象proxy,通过这个对象即可调用远程服务器方法。我们可以看下这个方法queryLocalInterface:

 /**
     * Attempt to retrieve a local implementation of an interface
     * for this Binder object.  If null is returned, you will need
     * to instantiate a proxy class to marshall calls through
     * the transact() method.
     */
    public IInterface queryLocalInterface(String descriptor);

为这个Binder对象尝试取出一个本地接口的实现,如果没有则需要proxy实例来通过transact来安排具体的调用方法。这个逻辑也就会在Stub的onTransact去实现。

我的简书地址:http://www.jianshu.com/u/b17039491e37

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值