android跨进程通知-远程服务Aidl

 最新手里的项目接近尾声,感觉自己关于android的东西有些混乱,因此想通过这段时间从头在梳理下android知识。也希望可以把在梳理过程中的一些跟大家分享,一起进步。

那么今天要说的就是跨进程远程服务-AIDL。实际开发中可能用到的比较少。

  在Android中通常使用AIDL来定义向客户端公开的接口,通俗的理解为,应用通过AIDL向其他应用提供接口。完成两个应用之间的交互。

构建远程服务的步骤:

1)编写一个AIDL文件来定义接口。AIDL文件使用java语法并拥有扩展名.aidl。AIDL文件内部使用的包名与Android项目使用的包名一致。

2)将AIDL文件放在src目录下

3)实现一个服务通过onBind()方法返回AIDL文件生成的接口。

4)配置服务在清单文件。

这样作为向外提供接口的server端就完成了。一般情况下,当你写完aidl文件,编译过后如果aidl文件没有语法问题会在应用的gen目录下生成aidl的Java文件。

AIDL的服务接口定义


AIDL 语法简单,用来声明接口,其中的方法接收参数和返回值,但是参数和返回值的类型是有约束的,且有些类型是需要 import,另外一些则无需这样做。

AIDL 支持的数据类型划分为四类,第一类是 Java 编程语言中的基本类型,第二类包括 String、List、Map 和 CharSequence,第三类是其他 AIDL 生成的 interface,第四类是实现了 Parcelable protocol 的自定义类。

其中,除了第一类外,其他三类在使用时均需要特别小心。

使用第二类时,首先需要明白这些类不需要 import,是内嵌的。其次注意在使用 List 和 Map 此二者容器类时,需注意其元素必须得是 AIDL 支持的数据类型,List 可支持泛型,但是 Map 不支持,同时另外一端负责接收的具体的类里则必须是 ArrayList 和 HashMap

使用第三、四类时,需要留意它们都是需要 import 的,但是前者传递时,传递的是 reference,而后者则是 value。

在创建 .aidl 文件的过程中,应该注意一旦 method 有参数,则需注意在前面加上 in, out 或 inout,它们被称为 directional tag,但是对于基本类型的参数,默认就是 in,并且不会是其他值。


下面是定义完aidl文件,编译后生成的aidl.java文件

到这里aidl已经完成定义,下面实现AIDL接口
1)新建service,在清单文件中注册
2)实现aidl.java中返回的Binder对象
3)返回Binder对象

这样服务器端的aidl接口实现就完成了,下面介绍下客户端调用服务器端的实现过程。
在客户端调用服务器端的aidl,需要在客户端有一份与服务器端相同的aidl文件,切记包名也要保持一致。
所以一般来说,直接把服务器端的aidl整体copy到客户端。
那么实现步骤如下:
1)在工程src先创建于服务器相同的adil文件,且包名相同。(编译会生成相同的aidl,java文件)
2)创建activity,实现serviceConnect方法,获取aidl,stub对象
3)调用aidl中的方法,通信

然后在activity中实现serviceConnect获取aidl返回的binder对象。进行通信。


这样就完成了 两个应用同dial进行交互数据访问了。

下面在说下aidl如何传递复杂数据实现Parcelable。


aidl传递Parcelable时,需要在改实体所在目录下写一个该实体的aidl文件。


ok,到这已经将aidl介绍完了。欢迎大家一起讨论。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值