Androd 第十八周

课前作业

  1. Android 中 ADIL 的作用是什么?
  2. AIDL 所支持的类型有哪些?
  3. 默认情况下,AIDL 的调用过程是同步还是异步?
  4. 如何指定 AIDL 为异步调用?

正式开始

一、AIDL 简介

AIDL 全称 Android Interface Definition Language,即 Android 接口定义语言。AIDL 用来暴露服务端的接口给客户端,简化服务的构建过程。Android 系统中的进程之间不能共享内存,因此需要提供一些机制在不同进程之间进行数据通信。为了使其他的应用程序也可以访问本应用程序提供的服务,Android 系统采用了远程过程调用方式来实现。与很多其他的基于 RPC 的解决方案一样,Android 使用一种接口定义语言来公开服务的接口。这种可以跨进程访问的服务称为 AIDL 服务

二 、AIDL 所支持的类型?

● 基本数据类型(int、long、char、boolean、double 等);
● String 和 CharSequence;
● List:只支持 ArrayList,里面每个元素都必须能够被 AIDL 支持;
● Map:只支持 HashMap,里面的每个元素都必须被 AIDL 支持,包括 key 和 value
● Parcelable:所有实现了 Parcelable 接口的对象;
● AIDL:所有的 AIDL 接口本身也可以在 AIDL 文件中使用。

三、AIDL 调用过程

1.Client 发起远程调用请求,也就是 RPC 到 Binder。同时将自己挂起,挂起的原因是要等待 RPC 调用结束以后返回的结果

2.Binder 收到 RPC 请求以后,收集参数,调用 transact() 方法,把 RPC 请求转发给 Service 端

3.Service 端收到 RPC 请求以后就去线程池里找一个空闲的线程去走 Service 端的 onTransact() 方法 ,实际上也就是真正在运行 Service 端的方法了,等方法运行结束,就把结果写回到 Binder 中

4.Binder 收到返回数据以后,唤醒 Client 线程并返回结果

四、AIDL 同步还是异步

AIDL 只有在你先允许来自不同应用的客户端跨进程通信访问你的 Service,并且想要在你的 Service 处理多线程的时候才是必要的。简单的来说,就是多个客户端,多个线程并发的情况下要使用 AIDL。官方文档还指出,如果你的 IPC 不需要适用多个客户端,就用 Binder。如果你想要 IPC,但是不需要多线程,那就选择 Messenger

默认情况下,本地进程下,AIDL 调用时同步的;远程进程下,使用 oneway 关键字可以指定 AIDL 为异步调用

五、Binder 的三个角色

1.继承了 IInterface 的接口的抽象类
2.Stub 类,继承了 Binder,实现了 IInterface 接口的实现类
3.Proxy 类,实现了 IInterface 接口的实现类

还有一个就是 Service,服务的实现类
在 onBind() 方法中,返回了继承 Binder 的 Stub 实例

猜你喜欢

转载自blog.csdn.net/qq_21586317/article/details/80304712