谈谈我对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,自然自身就会是一个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去实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容