1. 1、本文档共30页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AIDL讲解

通信机制的核心——IBinder 在Linux的概念空间中,Android的每个Activity都是一个独立的进程,每个Service也都是一个独立的进程,Activity,Service之间要交换数据属于IPC。IBinder就是为了Activity Service通讯而设计的一个轻量级的IPC框架。IBinder传递的数据被封装到android.os.parcel(注意parcel并非通用的序列化机制,而是专为IBinder设计的)客户端通过IBinder发送请求给服务端,服务端提供实际服务。 示例简介 这个示例用两个Demo来说明AIDL的创建和应用,分别为:服务端实现(AidlServer)、客户端实现(AidlClient)。 要实现的效果:服务端(AidlServer)包含角色信息并开启了一个service,客户端(AidlClient)从服务端获取信息(图片、文字)。 AIDL通信Server端实现 AIDL通信Server端实现 需要演示的内容有普通参数跨进程读取、对象的跨进程读取、Bitmap的跨进程读取。Role是一个JavaBean,里面包含了角色的各种信息和头像(Bitmap)。DataProvider是为外界APP提供服务的。AndroidManifest.xml中注册时需要添加一个IntentFilter以便被外界启动。 AIDL通信Server端实现 AIDL通信Server端实现 AIDL通信Server端实现 AIDL文件的语法跟Java的语法几乎一致,只是文件的扩展名不是.java而是.aidl本例主要是通过MyAidl去向外界提供服务的。 AIDL通信Server端实现 第一行表示该aidl文件所在的包名。先看主方法,里面定义了3个方法,分别为getRoleList() 、getRole(String name)、getName()。返回值分别为List、Role、String。(需要特别注意,不是基本数据类型,需要有方向指示,包括in、out和inout,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置)每个Aidl文件中只能定义一个Interface。其中Role是我们自定义的实体类,Aidl并不能找到这个类,所以需要倒包,但是这个包是Role.java和Role.aidl所在的包。Role.aidl是对Role.java的一个指向。 Role.aidl中只有一句话,意思是指向了一个实现了parcelable接口的Java类。 AIDL通信Server端实现 AIDL通信Server端实现 Role类是一个序列化的类,这里使用Parcelable 接口来序列化,他是Google 提供的一个比Serializable 效率更高的序列化类。(什么是序列化? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给我们提供了一种较好的保存对象状态的机制,那就是序列化。) 实现序列化,我们要实现三个方法: 1、describeContents() 没搞懂有什么用,反正直接返回0也可以 2、writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中. 3、静态的Parcelable.Creator接口,本接口有两个方法: 一为createFromParcel(Parcel source) 实现从source中创建出类的实例的功能。另一个为newArray(int size) 创建一个类型为T,长度为 size的数组,仅一句话(return new Role[size]即可,估计本方法是供外部类反序列化本类数组使用。 AIDL通信Server端实现 DataProvider是Service的子类,DataProvider类中定义了一个内嵌类(AidlImpl),该类是MyAidl.Stub的子类 。? MyAidl.Stub是根据MyAidl.aidl文件自动生成的,一般并不需要管这个类的内容,只需要编写一个继承于MyAidl.Stub类的子类(即AidlImpl)即可。onBind方法必须返回AidlImpl类的对象实例,否则客户端无法获得服务对象。 AIDL通信Client端实现 AIDL通信Client端实现 首先,把Server的gen下面com.raven.domain包完全copy过来,因为上面用到了Role这个实体类,也需要把Role类拷过来。 AIDL通信Client端实现 AIDL通信Client端实现 AIDL通信Client端实现 接下来,被实例化之后的mService就可以用来获取远

文档评论(0)

qwd513620855 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档