AIDL传递复杂类型对象的特殊处理 Android开发之Service

  次阅读 来源:互联网(转载协议) 2016-01-19 12:09 我要评论(0)

AIDL传递复杂类型对象的特殊处理

前面已经介绍了通过AIDL接口在进程间传递系统允许的数据,如果需要传递一个复杂类型的对象,就没那么简单了,需要额外做一些处理。如下:

定义数据接口的AIDL文件中,使用parcelable关键字,例如:parcelable Message;

在其数据实现类中实现Parcelable接口,并实现对应的方法。

在业务接口的AIDL文件中,使用import引入数据接口AIDL的包名。

例如:Message.aidl

1 parcelable Message;

例如:IGetMsg.aidl

1 package com.example.aidlservicedemo.domain;

2

3 // 这是两个自定义类

4 import com.example.aidlservicedemo.domain.Message;

5 import com.example.aidlservicedemo.domain.User;

6

7 interface IGetMsg{

8 // 在AIDL接口中定义一个getMes方法

9 List getMes(in User us);

10 }

Parcelable与Parcel接口

先来说说Android对象序列化,在Android中序列化对象主要有两种方式,实现Serializable接口或是实现 Parcelable接口。Serializable接口是JavaSE原生支持的,而Parcelable接口是Android所特有的,它的序列化和 反序列化的效率均比Serializable接口高,而AIDL进行在进程间通信(IPC),就是需要实现这个Parcelable接口。

Parcelable接口的作用:实现了Parcelable接口的实例,可以将自身的数据信息写入一个Parcel对象,也可以从 parcel中恢复到对象的状态。而Parcel就是完成数据序列化写入的载体。

上面提到Parcel,再来聊聊Parcel是什么?Android系统设计之初,定位就是针对内存受限的设备,因此对性能要求更好,所以系统 中采用进程间通信(IPC)机制,必然要求性能更优良的序列化方式,所以Parcel就被设计出来了,其定位就是轻量级的高效的对象序列化机制与反序列化 机制。如果读一下Android的底层代码,会发现Parcel是使用C++实现的,底层直接通过Parcel指针操作内存实现,所以它的才更高效。

Parcel也提供了一系列的方法帮助写入数据与读取数据,这里简单介绍一下:

obtain():在池中获取一个新的Parcel。

dataSize():得到当前Parcel对象的实际存储空间。

dataPostion():获取当前Parcel对象的偏移量。

setDataPosition():设置当前Parcel对象的偏移量。

recyle():清空、回收当前Parcel对象的内存。

writeXxx():向当前Parcel对象写入数据,具有多种重载。

readXxx():从当前Parcel对象读取数据,具有多种重载。

简单来说,Parcelable通过writeToParcel()方法,对复杂对象的数据写入Parcel的方式进行对象序列化,然后在需要 的时候,通过其内定义的静态属性CREATOR.createFromParcel()进行反序列化的操作。Parcelable对Parcel进行了包 装,其内部就是通过操作Parcel进行序列化与反序列化的。

Parcelable与Parcel均定义在android.os包下,而这种机制不仅用于AIDL,还可以用于Intent传递数据等其他地 方,这不是本篇博客的主题,以后用到再详细介绍。

实现Parcelable接口

定义好数据接口的AIDL文件后,需要定义一个数据实现类,实现Parcelable接口,并实现对应的方法,Parcelable有如下几个 必须要实现的抽象方法:

abstract int describeContents():返回一个位掩码,表示一组特殊对象类型的Parcelable,一般返回0即可。

asbtract void writeToParcel(Parcel dest,int flags):实现对象的序列化,通过Parcel的一系列writeXxx()方法序列化对象。

除了上面两个方法,还需要在实现类中定义一个名为"CREATOR",类型为"Parcelable.Creator"的泛型静态属性,它实现 了对象的反序列化。它也有两个必须实现的抽象方法:

abstract T createFromParcel(Parcel source):通过source对象,根据writeToParcel()方法序列化的数据,反序列化一个Parcelable对象。

本站部分文章来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

网友点评网友点评
阅读推荐阅读推荐

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...