AIDL 生成的就是 IMyService
这个接口,而 Stub
和 Proxy
则是这个接口的两个内部类,分别是 Binder
类和 BinderProxy
类的子类(Proxy
类虽然是用组合方式来持有 BinderProxy
的,但实际就是在直接用这个类,只不过做了一层封装,让其更易使用而已),Stub
和 Proxy
都实现了 IMyService
。
所以 IInterface
到底是什么,它就是一个用于表达 Service
提供的功能的一个契约,也就是说 IInterface
里有的方法,Service
都能提供,调用者你别管用的是 BinderProxy
还是什么,只要拿到 IInterface
,你就可以直接调用里面的方法,它就是一个接口。
同时 Stub
虽然实现了 IMyService
,但是并没有实现厘米的任何方法,它是一个抽象类,开发者需要自己子类化 Stub
去实现具体的功能。
Proxy
实现了 IMyService
,并且实现了里面的方法,这些方法的实现我们下面再说。
为什么 IMyService
要分 Stub
和 Proxy
呢?这是为了要适用于本地调用和远程调用两种情况。如果 Service 运行在同一个进程,那就直接用 Stub
,因为它直接实现了 Service 提供的功能,不需要任何 IPC 过程。如果 Service 运行在其他进程,那客户端使用的就是 Proxy
,这里这个 Proxy
的功能大家应该能想到了吧,就是把参数封装后发送给 Binder 驱动,然后执行一系列 IPC 操作最后再取出结果返回。
好,到这里请求用 Proxy
发出去了,Service 怎么接受请求并作出响应呢,这就需要 Stub
了,还记得我们的 Stub
是继承自 Binder
的吗?Binder
有一个 onTransact
方法,而 Stub
重写了这个函数,这个函数三个重要参数:int code
、Parcel data
、Parcel reply
,分别对应了