time 
设为首页】【收藏本站
当前位置: 主页 > 电脑网络 > 操作系统 > 嵌入式 > Android > Android应用开发入门(五十一)AIDL接口通过绑定Service在进程间传递复杂对象

Android应用开发入门(五十一)AIDL接口通过绑定Service在进程间传递复杂对象

时间:2013-11-19 10:56 点击:3697次 字体:[ ]




前言

  Android的AIDL不仅可以在绑定服务中传递一些Android规定的数据类型的数据,还可以传递一些复杂类型的数据。但是与传递系统允许的数据类型相比,复杂类型数据的传递要做更多的工作,本文就讲解一下如何使用AIDL接口通过绑定服务在进程间传递数据。关于AIDL传递规定类型数据的内容,不了解的朋友可以看看:http://www.fengfly.com/plus/view-214084-1.html

  本文的主要内容:

  1. AIDL传递复杂类型对象的特殊处理
  2. Parcelable与Parcel接口
  3. 实现Parcelable接口
  4. AIDL传递复杂类型对象Demo
  5. AIDL传递对象序列化过程详解

 

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

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

  1. 定义数据接口的AIDL文件中,使用parcelable关键字,例如:parcelable Message;
  2. 在其数据实现类中实现Parcelable接口,并实现对应的方法。
  3. 在业务接口的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<Message> getMes(in User us);  

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传递数据等其他地方,这不是本篇博客的主题,以后用到再详细介绍。



本文地址 : http://www.fengfly.com/plus/view-214087-1.html
标签: Android Service AIDL
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: