Android IPC之AIDL

首先说一下Android进程间的集中通讯方式

1.使用Bundle   ----> 用于android四大组件间的进程间通讯
2.使用文件共享  ---->用于单线程读写

3.使用Messenger   ---->用于可存放在message中的数据的传递java

4.AIDL android 接口定义语言  ---->主要用于调用远程服务的方法的状况 还能够注册接口 android

 

 

本文大体说一下第四种方式 AIDL,废话很少说了,直接上代码git

先看一下host的目录结构:github

IMyAidlInterface.aidl 是默认新建的AIDL文件,以后我会在里面增长部分代码,新建AIDL文件方法以下(切记,新建aidl文件后记得make project一下,as会给咱们默认生成不少aidl对应的java代码!):数据结构

 

咱们打开IMyAidlInterfacegradle

咱们就以上代码稍做简介:spa

1.basciTypes 是建立aidl默认的生成的代码, 展现给咱们一些默认支持的数据类型线程

2.getName() 返回一个默认支持类型 String,不须要作额外处理3d

3.getPerson() 自定义返回类型blog

若是咱们返回一个基础类型,不须要作额外的处理,建立目录结构中的 MyService, 重构其中的方法,getName直接返回一个简单的String

最后在mainfest 添加service的相关配置:

 

而后咱们新建 client项目,咱们将 host中的aidl文件夹原封不动复制到client ,复制完成client 目录结构以下:

 

client中直接bind host中的service就能够调用方法了,下面是 client中的代码:

 

 点击按钮查看效果,成功:

 

 使用自定义数据类型,必须继承 Parcelable,咱们返回host中查看代码:

1.新建class Person:

 新建Person.aidl

这样咱们就能够在 IMyAidlInterface新建方法getperson访问该自定义数据结构了(Person 必须手动导入,as不会帮咱们自动导入):

若是想把 gedPerson方法单独写在另外一个结构里,咱们能够新建一个aidl, IPerson:

 

 最后注意一点坑,咱们必须在host以及client(demo3)的gradle中加入一下配置,不然在AIDL中导入自定义Person的时候会报错,找不到Person:

 

项目地址: https://github.com/dengshaomin/AndroidDemo.git ,在里面找AIDL.ZIP

相关文章
相关标签/搜索