• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Android AIDL的使用和源码

武飞扬头像
由心
帮助5

一、AIDL如何使用?

1、先建立一个工程项目AidlServer, 作为服务端:

学新通学新通

2、新建一个aidl文件: 学新通学新通 名字自己取,我这里取的是IRemoteService,之后我们就可以看到,文件的生成了,如下: 学新通学新通 学新通学新通

3、aidl文件建好之后,我们要rebuild一下,这样系统会自动帮我们一些文件,我们跨进程的通信核心代码,基本就在这几个文件里了,下面我们再来仔细分析这个几个文件: 学新通学新通

4、rebuild完之后,我们接着新建一个Service,这是用来给客户端调用通信的: 学新通学新通 名字自己取,我这里取的是MyService: 学新通学新通 接着要在AndroidManifest.xml配置下Service: 学新通学新通

5、服务端配置好了,现在轮到配置客户端了,新建一个项目工程AidlClient,需要把服务端的aidl文件下一整个复制过来,注意什么都不要改它的:

学新通学新通

复制过来后,rebuild一下。

6、接着就是绑定我们在服务端设置的service: 学新通学新通 这样,就完成了客户端与服务端进程间通信了。

二、理解AIDL的原理

从上面我们知道,系统会帮我们自动生成一些aidl相关的代码: 学新通学新通

我们来看下这个自动生成的接口IRemoteService文件,它继承了系统的IInterface接口 学新通学新通

IRemoteService里面有个Stub类,这个Stub类继承了Binder类,进程间的通信核心就是由Stub来完成的学新通学新通

而在Stub里,有一个asInterface方法,这个方法用来将服务端的Binder对象(也就是Stub)转换为客户端所需的AIDL接口类型的对象,我们可以来看下AidlClient项目工程里的代码: 学新通学新通

接着回来继续看asInterface方法: 学新通学新通 再来看Stub类中的onTransact方法:

  • code : 确定客户端请求的目标方法是什么。
  • data : 如果目标方法有参数的话,就从data取出目标方法所需的参数。
  • reply : 当目标方法执行完毕后,如果目标方法有返回值,就向reply中写入返回值。

这个onTransact方法就是服务端处理的核心。接收到客户端的请求,并且通过客户端携带的参数,执行完服务端的方法,返回结果。 学新通学新通

从asInterface方法里,我们知道,服务端和客户端如果不在同一个进程的话,会返回系统封装后的Stub.Proxy对象,在new 这个Proxy对象时,传入了obj这个参数,这里的obj就是服务端的Binder对象,也就是说Proxy的构造方法里,mRemote代表的就是服务端的Binder对象: 学新通学新通

在Proxy类里,我们看到有个getInfo()方法,这个方法就是我们之前在创建aidl文件时,自己定义的,提供给客户端调用的: 学新通学新通 学新通学新通

总结下客户端调用getInfo()方法的过程: 学新通学新通

Stub充当服务端角色,持有Binder实体(本地对象)。

获取客户端传过来的数据,根据方法 ID 执行相应操作。
将传过来的数据取出来,调用本地写好的对应方法。
将需要回传的数据写入 reply 流,传回客户端。
Proxy代理类充当客户端角色,持有Binder引用(句柄)。

生成 _data 和 _reply 数据流,并向 _data 中存入客户端的数据。
通过 transact() 方法将它们传递给服务端,并请求服务端调用指定方法。
接收 _reply 数据流,并从中取出服务端传回来的数据。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfgkkkb
系列文章
更多 icon
同类精品
更多 icon
继续加载