Android基础——AIDL总结篇

这篇同样是Android开发者文档的翻译总结:


Android Interface Definition Language:

顾名思义AIDL是一种接口定义语言,它适用于定义不同进程间通信的接口的,因为在Android中进程是无法轻易的访问其他进程的。

note:只有在要处理多线程的并发访问时,才需要使用到AIDL。


Defining an AIDL Interface:

我们需要在src/目录下定义接口在一个.aidl的文件,接口的定义语法和Java接口的定义语法很类似。并且将它保存在服务的宿主应用和所有绑定服务的应用中。我们的开发环境会用AndroidSDK的工具根据定义的.aidl文件生成一个IBinder接口的.java文件,并将它保存在gen/目录下。我们在service中要实现这个接口。


利用AIDL创建绑定服务要经过如下一些步骤:

1,创建一个.aidl文件:

这个文件中定义接口的方法签名;

2,实现这个接口:

在gen/目录下生成的.java文件,有一个继承了Binder类并且实现了AIDL定义的接口的内部类Stub,我们必须继承这个类。

3,将接口暴露给客户端:

在Service中覆盖onBind()方法,并返回这个Stub 的实现类。

要注意的是,如果我们要对之前的接口定义进行修改,一定要保持它的兼容性。


Create the aidl file:

AIDL支持下面的数据类型:

·Java中的所有基本数据类型;

·String;

·CharSequence;

·List:

List中的元素必须是这些支持的数据类型或者是在用AIDL定义过的parcelable。List支持泛型定义(List<String>)。虽然我们使用的是List,但是在另一端接受的类型总是ArrayList。

·Map:

Map中数据元素类型和List的要求是一样的,只是Map是不支持泛型定义的。

我们在使用其他数据类型时需要使用import关键字导入,即便是他们是在同一个包中。


Implement the method:

内部类Stub中定义了一个静态方法:asInterface()。我们需要在serviceConnection的onServiceConnected方法中使用它将传递过来的IBinder对象转换为Stub实现类对象。


注意:

·我们必须要考虑这些实现方法的线程安全问题;

·如果这些方法要做耗时的操作,不应该在activity的主线程中调用。


Expose interface to client:

在客户端binderService建立连接时,通过onserviceConnected()方法传递IBinder对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值