此类继承了android.os.IInterface这个接口,同时它自己也是接口(所以可以在Binder中传输的接口都需要继承此接口)
结构:
1.声明两个方法,同时声明了两个整型id表示两方法(用于标识在transact过程中,客户端请求的方法)
2.声明一个内部类Stub->Binder类
客户端与服务端位于同一进程时,方法调用不会走跨进程的transact过程
不同进程,transact过程/逻辑由Stub内部代理类Proxy来完成
Tips:核心【内部类Stub+Stub内部代理类Proxy】
DESCRIPTOR:Binder唯一标识,一般用Binder类名标识
asInterface(android.os.IBinder obj):用于把服务端的Binder->客户端所需AIDL接口类型对象
同一进程,返回服务端Stub本身,否则返回系统封装后的Stub.proxy对象
asBinder:用于返回当前Binder对象
onTransact:运行可服务端的Binder线程池中(int code,android.os.Parceldata,android.os.Parcel reply,int flag)
服务端通过Code确定请求的目标方法/从data中取出目标方法所需参数/执行目标方法->向reply写入返回值
Proxy#getBookList:运行于客户端
内部实现 1.创建该方法所需输入型Parcel对象(-data),输出型Parcel对象(-reply),和返回值对象list。
2.把该方法参数写入-data
3.调用transact发起RPC(远程过程调用),同时线程挂起
4.服务端onTransact会被调用,知道RPC过程返回,线程进行,从reply中取出RPC过程的返回结果,返回reply的数据
Proxy#addBook:运行在客户端,同上执行过程,无返回值,不需要从—reply中取出返回值。