听说你用过AIDL,来回答一下下面的问题
远程服务和本地服务有什么区别?
远程Service与调用者不在同一个进程里(即远程Service是运行在另外一个进程);而本地服务则是与调用者运行在同一个进程里.
与Binder和AIDL相关的类有哪些?
AIDL生成的是IMyService接口,stub和proxy都实现了IMyService。
IInterface是什么?
IInterface是一个用于表达Service提供的功能的一个契约,也就是说IInterface里有的方法,Service都可以提供,只要拿到IInterface,就可以直接调用里面的方法,就是一个接口。
IMyService为什么要分Stub和Proxy?
这是为了适用于本地调用和远程调用两种情况。
- 如果Service运行在和Client同一个进程,那么直接使用Stub即可。
- 如果Service运行在其他进程,客户端使用的是Proxy,这里这个Proxy的功能就是把参数封装后发送给Binder驱动,然后执行一系列IPC操作最后再取出结果返回。
如果使用的是远端服务,是不是Stub就没用了?
不是的,Client使用Proxy发出去消息后,Service接受请求并作出相应就需要Stub,Stub是继承自
如何判断Service运行在同一个进程还是不同的进程?
如果 Service 运行在同一进程,那么客户端拿到的 IBinder 就是 Stub 类,而 Stub 的 queryLocalInterface 又会返回自己;而 Service 运行在单独进程中时,客户端拿到的 IBinder 就是系统提供好的 BinderProxy,BinderProxy 中的 queryLocalInterface 默认直接返回 null,根据代码,asInterface 就会构造一个 Proxy 返回给客户端。接着就继续我们之前那个问题提到的流程。
AIDL是不是Binder IPC必需的?
不是的,AIDL只是一种规范,我们完全可以用binder类和BinderProxy类就可以自己实现Service与客户端的通信。
例如:
Service
Client
但是在日常开发中,我们最好还是按照AIDL的规范来进行操作。