AIDL对Java类型的支持

  1. AIDL支持Java原始数据类型
  2. AIDL支持String和CharSequence
  3. AIDL支持传递其他AIDL接口,但你引用的每个AIDL接口都需要一个import语句,即使位于同一个包中
  4. AIDL支持传递实现了android.os.Parcelable接口的复杂类型,同样在引用这些类型时也需要import语句
  5. AIDL支持java.util.List和java.util.Map,但是有一些限制。集合中项的允许数据类型包括Java原始类型、String、CharSequence或是android.os.Parcelable。无需为List和Map提供import语句,但需要为Parcelable提供import语句
  6. 非原始类型中,除了String和CharSequence以外,其余均需要一个方向指示符。方向指示符包括in、out、和inout。in表示由客户端设置,out表示由服务端设置,inout表示客户端和服务端都设置了该值

增加的内容

AIDL传递复杂类型对象的特殊处理。前面已经介绍了通过AIDL接口在进程间传递系统允许的数据,如果需要传递一个复杂类型的对象,需要额外做一些处理。如下:
1. 定义数据接口的AIDL文件中,使用parcelable关键字,例如:parcelable Person
2. 在其数据实现类中实现Parcelable接口,并实现对应的方法
3. 在业务接口的AIDL文件中,使用import引入数据接口AIDL的包名

Person.java是实现了parcelable的类型,Person.aidl是其数据接口aidl文件,IPerson.aidl文件是其业务接口aidl文件。还需要注意一点的是aidl文件的接口名需要和其文件名保持一致。

定义一个自定义数据类型并定义该数据接口的AIDL文件

这一步很容易被忽略,因为我们平时使用的Bean或者其他数据类型都不会单独去定义一个数据接口。如果这一步忘记的话,将会出现
couldn't find import for class
的错误。

定义了Person之后,添加该类型的AIDL如下:Person.aidl

package com.example.aidl;parcelable Person;

实现该类型的Parcelable接口并添加一个静态CREATOR

Person的静态数据成员CREATOR:

此静态属性,则是为了反编译时使用,在Parcelable进行反编译时将会调用该属性,所以名称写法基本是固定不变的。由于其中重载的第二个函数使用了赋值构造,所以在自定义数据类型中还需要一个赋值构造函数。当然如果不重载该函数也就不需要赋值构造了。

public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {@Overridepublic Person[] newArray(int size) {return new Person[size];}@Overridepublic Person createFromParcel(Parcel source) {return new Person(source);}};

需要重载的函数writeToParcel(),根据自己定义的实际情况来写,这里的Person使用了一个String成员变量,一个int 和一个float[]。具体的写入操作,一定需要注意的是写入顺序则决定了读取顺序

@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeInt(age);dest.writeString(name);if (scores != null) {dest.writeInt(scores.length);dest.writeFloatArray(scores);} else {dest.writeInt(0);}}

关于两种序列化的对比和区别

(Parcelable接口告诉Android运行时在封送(marshalling)和解封送(unmarshalling)过程中实现如何序列化和反序列化对象,你可以很容易联想到java.io.Serializable接口。有些朋友可能会有疑问,两种接口功能确实类似,但为什么Android不用内置的Java序列化机制,而偏偏要搞一套新东西呢?这是因为Android团队认为Java中的序列化太慢,难以满足Android的进程间通信需求,所以他们构建了Parcelable解决方案。Parcelable要求显示序列化类的成员,但最终序列化对象的速度将快很多。另外要注意的是,Android提供了两种机制来将数据传递给另一个进程,第一种是使用Intent将数据束(Bundle)传递给活动,第二种也就是Parcelable传递给服务。这两种机制不可互换,不要混淆。也就是说,Parcelable无法传递给活动,只能用作AIDL定义的一部分)。

定义业务类型的AIDL文件

业务类型的AIDL和之前一样,定义其中的方法,并且在Client和Service中保留一份,然后就可以使用了。

注意一点的是需要导包,也就是下面的第二行

package com.example.aidl;import com.example.aidl.Person;interface IPerson{Person getPerson();}

使用该AIDL进行通信和方法调用

该过程和基本数据类型的通信过程一模一样,只要在上述定义自定义类型处实现了数据接口的AIDL和业务类型的AIDL,那么按之前的一篇博文中所将的步骤(此时自定义的类型已经可以当做是基本类型被支持了),依次实现服务端和客户端的内容即可。
步骤依然是服务端的Service中的onBind()方法的重载和Manifest文件中的service的配置。客户端的Intent和ServiceConnection。具体可以看最下方源码链接中的实现。

执行结果

默认构造了一个Person对象,zhangsan ,年龄20,以及三门课程的成绩。

源代码及参考链接

最近的两篇博文中的文件目录和全部的代码都在里面,可以参考一下。里面的Log写的不规范,代码也很乱,欢迎提出意见,哈哈……

Client:
https://github.com/zp-zone/AIDLClient

Service:
https://github.com/zp-zone/AIDLService

参考链接:
http://blog.csdn.net/liuhe688/article/details/6409708
http://www.android100.org/html/201507/13/164469.html
http://www.2cto.com/kf/201507/419263.html

【Android】使用AIDL传递用户自定义类型数据--附完整示例代码相关推荐

  1. python快速入门—————附完整示例代码

    文章目录 0 背景 1 基本概念和操作 1.1 概念 1.2 操作 2 基本数据结构 2.1 list(列表) 2.2 tuple(元祖) 2.3 dict(字典): 2.4 Set(集合)----字 ...

  2. [微信小程序]组件化开发,以一个自定义模块框组件当做示例(附完整示例代码和效果图)

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 正文: 自定义组件我把它分为简单的三个步骤, 1.创建组件 --- 2.编写组件  ---   3.调用,使用 ...

  3. 使用secondary sort实现数据关联 完整示例代码

    需要进行两种数据的关联, 费了好大劲, 最后才使用secondary sort解决 其中有几个地方需要注意: 1 readFields 和 writeFields 的写法需要完全一致, 否则写入和读取 ...

  4. Android java传递string类型数据给C

    本文接着实现<Android java传递int类型数据给C>的还未实现的方法: public native String sayHelloInC(String s); 先贴一个工具方法, ...

  5. Android 拖动条(SeekBar)实例 附完整demo项目代码

    Android 拖动条(SeekBar)实例 附完整demo项目代码 1.拖动条的事件 实现SeekBar.OnSeekBarChangeListener接口.需要监听三个事件: 数值改变(onPro ...

  6. Pytorch TextCNN实现中文文本分类(附完整训练代码)

    Pytorch TextCNN实现中文文本分类(附完整训练代码) 目录 Pytorch TextCNN实现中文文本分类(附完整训练代码) 一.项目介绍 二.中文文本数据集 (1)THUCNews文本数 ...

  7. 详细介绍用MATLAB实现基于A*算法的路径规划(附完整的代码,代码逐行进行解释)(一)--------A*算法简介和环境的创建

       本系列文章主要介绍基于A*算法的路径规划的实现,并使用MATLAB进行仿真演示.本文作为本系列的第一篇文章主要介绍如何进行环境的创建,还有一定要记得读前言!!! 本系列文章链接: ------- ...

  8. Pytorch LSTM实现中文单词预测(附完整训练代码)

    Pytorch LSTM实现中文单词预测(附完整训练代码) 目录 Pytorch LSTM实现中文单词预测(词语预测 附完整训练代码) 1.项目介绍 2.中文单词预测方法(N-Gram 模型) 3.训 ...

  9. java 静态数据_Java 静态数据初始化的示例代码

    无论创建多少个对象,静态数据都只占用一份存储区域.static关键字不能应用于局部变量,因此它只能作用于域.如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初始值:如 ...

最新文章

  1. 计算机音乐是哪一个,哪种软件适合音乐编辑的计算机版本?
  2. Python-面向对象的编程语言
  3. boost::multiprecision模块tommath相关的测试程序
  4. dropdownlist 实现无限级树形菜单
  5. webservice学习总结(一)-- WebService相关概念介绍
  6. Office 2010 体验系列之Outlook使用
  7. Kubernetes 小白学习笔记(23)--kubernetes的运维-管理Pod
  8. python中聚类和分类的区别_关于聚类和分类的详细信息
  9. html表格中加入斜线,Html Table 表格 画斜线
  10. FTP文件实现上传下载
  11. 电脑的脉搏---时钟频率的来龙去脉
  12. 手把手教如何用bib文件在latex里引用文献
  13. [车]上海外地“苏牌”竟要万元
  14. 关于URL中带空格的问题
  15. 至于你信不信(由你),我反正信了
  16. Visual studio 2017 安装
  17. linux上咋修复windows引导,linux rescue 修复引导 与linux下修复windows引导
  18. scrcpy设置快捷键_Scrcpy投屏控制器下载|Scrcpy(安卓手机投屏神器)附使用教程 v1.16官方版...
  19. 大数据Hadoop3.1.3 HDFS 详细入门笔记
  20. mediarecorder自制录相机花屏问题 微信录制视频花屏

热门文章

  1. HALCON表面划痕检测
  2. Slab,小对象也能搞出大事情
  3. 描述一下Spring框架的作用和优点?
  4. oracle 9i net基本配置
  5. Linux下用户组、文件权限详解
  6. SpringMVC图片上传
  7. 201621123028《Java程序设计》第一周学习总结
  8. 基于TestNG 与Selenium 的自动化测试设计与实施
  9. Oracle别名大小写 -----解决方案
  10. Maven 使用代理下载依赖