看你用过AIDL,来回答一下下面的问题

听说你用过AIDL,来回答一下下面的问题

远程服务和本地服务有什么区别?

远程Service与调用者不在同一个进程里(即远程Service是运行在另外一个进程);而本地服务则是与调用者运行在同一个进程里.

本地服务和远程服务的区别

与Binder和AIDL相关的类有哪些?

AIDL生成的是IMyService接口,stub和proxy都实现了IMyService。

IInterface是什么?

IInterface是一个用于表达Service提供的功能的一个契约,也就是说IInterface里有的方法,Service都可以提供,只要拿到IInterface,就可以直接调用里面的方法,就是一个接口。

IMyService为什么要分Stub和Proxy?

这是为了适用于本地调用和远程调用两种情况。

  1. 如果Service运行在和Client同一个进程,那么直接使用Stub即可。
  2. 如果Service运行在其他进程,客户端使用的是Proxy,这里这个Proxy的功能就是把参数封装后发送给Binder驱动,然后执行一系列IPC操作最后再取出结果返回。

如果使用的是远端服务,是不是Stub就没用了?

不是的,Client使用Proxy发出去消息后,Service接受请求并作出相应就需要Stub,Stub是继承自

如何判断Service运行在同一个进程还是不同的进程?

如果 Service 运行在同一进程,那么客户端拿到的 IBinder 就是 Stub 类,而 StubqueryLocalInterface 又会返回自己;而 Service 运行在单独进程中时,客户端拿到的 IBinder 就是系统提供好的 BinderProxyBinderProxy 中的 queryLocalInterface 默认直接返回 null,根据代码,asInterface 就会构造一个 Proxy 返回给客户端。接着就继续我们之前那个问题提到的流程。

AIDL是不是Binder IPC必需的?

不是的,AIDL只是一种规范,我们完全可以用binder类和BinderProxy类就可以自己实现Service与客户端的通信。

例如:
Service

Service.onBind

Client

Client.serviceConnected

但是在日常开发中,我们最好还是按照AIDL的规范来进行操作。

Binder远程通信流程是什么样的?

Binder通信流程