收藏 分享(赏)

AIDL使用攻略.pdf

上传人:HR专家 文档编号:5878655 上传时间:2019-03-20 格式:PDF 页数:14 大小:1.16MB
下载 相关 举报
AIDL使用攻略.pdf_第1页
第1页 / 共14页
AIDL使用攻略.pdf_第2页
第2页 / 共14页
AIDL使用攻略.pdf_第3页
第3页 / 共14页
AIDL使用攻略.pdf_第4页
第4页 / 共14页
AIDL使用攻略.pdf_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、 Android Interface Definition Language AIDL Raven Wang 一、 简介 AIDL全称 Android Interface Definition Language即 Android接口定义语言,被用作不同进程间的通信,随着客户端的群组化和需求的复杂化,单一的 APK 已经无法满足客户的需求 ,面对庞大的代码量 , 效率和用户体验 再一次 被提了出来。于是 IPC( interprocess communication进程间通信 ) 显 的格外重要! 在启动我们的 APP的时候我们可以连带启动另外一个 APP去提供数据,去处理一些繁琐的问题 ,就像

2、 Android一样,为每一个应用分配单独的一个虚拟机,就算出现了 APP的 Crash,也不会影响整个系统 。例如:音乐播放器 会带来不小的内存开销,在这种情况下多多少少都会带来一些问题,比如用户点击播放器界面之后反应慢等。如果采取 Service 和 Widget 结合,通过 AIDL去传输数据的话,至少可以保证 UI的流畅 ,还是 很有价值的 。 二、 AIDL通信 Server端实现 1、 创建 AidlServer 这个 Demo需要演示的内容有普通参数跨进程读取、对象的跨进程读取、 Bitmap的跨进程读取。 Role 是一个 JavaBean,里面包含了角色的各种信息和头像( B

3、itmap)。DataProvider是为外界 APP提供服务的 Service。在 AndroidManifest.xml 中注册时需要添加一个 IntentFilter以便被外界启动。 2、 创建 AIDL文件 AIDL文件的语法跟 Java的语法几乎一致,只是文件的扩展名不是 .java而是 .aidl 本例主要是通过 MyAidl去 向 外界提供服务的。 第一行表示该 aidl文件所在的包名 。 先看主方法,里面定义了 3 个方法,分别为 getRoleList() 、 getRole(String name)、getName()。返回值分别为 List、 Role、 String。

4、需 要特别注意,不是基本数据类型,需要有方向指示,包括 in、 out 和 inout, in 表示由客户端设置, out 表示由服务端设置, inout 是两者均可设置 ,每个 Aidl文件中只能定义一个 Interface。 其中 Role 是我们自定义的实体类, Aidl 并不能找到这个类,所以需要倒包,但是这个包是 Role.java和 Role.aidl所在的包。 Role.aidl是对 Role.java的一个指向。 其中只有一句话,意思是指向了一个实现了 parcelable接口的 Java类。 2、 实体类的实现 使用的类要实现 Parcelable 接口来序列化, 这 是 A

5、ndroid提供的一个比 Serializable 效率更高的序列化 接口 。 基本上我们要去实现三个方法 : (不知道这个内容描述是干什么用的,返回 0是没问题的) Parcel的意思是箱子,这里可以把它理解成容器,一个存放可持久化对象的容器 ,我们把需要存放的值放到容器里保管 。 下面方法个定义必须为 public static final Parcelable.Creator CREATOR = new Creator(); 其中需要实现 2个方法,第一个返回一个数组,关键是第二个,他是从序列化中恢复对象的关键,我们从容器中拿出我们想要的值,然后封装成对象,然后把对象返回。 ( Imag

6、 为 Bitmap 类型,因为 Bitmap 也是实现了 Parcelable 接口,所以可以直接调用createFromParcel(parcel)去获取。) 整个实体类 写法 如下: 3、 创建 Service 注意:在 Service的 onBind方法中要去返回 MyAidl.Stub这也是一个 IBinder对象(先不说为什么) ,在这个内部类中会出现我们在 aidl文件中声明的方法。 4、 还差一点点,编译项目。 当 BuildProject之后,在 gen下会出现 Eclips自动编译好的 MyAidl.java文件 到此为止, Server端的工作已基本 完成 ,我是在 Ser

7、vice的 OnCreate方法中准备的数据,数据怎样去准备纯属依个人喜好 。 添加一张酷图做头像放到 drawable下面名为 kbz.png 三、 AIDL通信 Client端的实现 1、创建 Project 首先二话不说,先把 Server的 gen下面的 com.raven.domain包完全 copy过来,因为上面用到了 Role 这个实体类,也需要把这个类拷过来。(如果客户只给了 .aidl 文件则需要根据 .aidl文件中的包名去手动创建 包,然后把 aidl文件放到该包下 Build一下便可得到 .java文件。如果手里只有 java文件的话,那么根据 java文件中的包名去手

8、动创建包即可 。 ) 2、数据的展现 写一个随意的 UI来展现数据,本例 UI如下 UI没什么可说的 3、远程调用。 远程调用时需要先定义一个 MyAidl 对象,然后定义一个 ServiceConnection 在其onServiceConnected方法中将 MyAidl对象实例化 好了,被实例化之后的 mService就可以用来获取远程数据了。 调用方法如下: 首先去 Bind提供服务的 Service 之后就可以直接调用 Server提供服务的方法了,即在 MyAidl.aidl中声明的方法。 Role role = mService.getRole(“提前准备好的数据 ”); MainActivity完整代码如下 Layout代码 安装完 2个 apk后启动 Client,先绑定 Service再获取角色,最终效果图如下: END MSN : Email :

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 网络生活

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报