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

Android应用开发入门(五十)AIDL接口通过绑定Service在进程间传递系统基本类型数据

时间:2013-11-19 10:47 点击:1568次 字体:[ ]




前言

  前面讲解了Service的一些基本内容。但是对于绑定服务传递数据,只局限于本地服务,无法使用服务进行跨进程间的交互。如果需要用到跨进程交互的话,需要用到一个新的技术-AIDL, 本文就针对AIDL如何传递内置类型数据进行讲解。对于Service不熟悉的朋友,可以先看看之前的文章:http://www.fengfly.com/plus/view-214081-1.html 、http://www.fengfly.com/plus/view-214082-1.htmlhttp://www.fengfly.com/plus/view-214084-1.html

  本文内容如下:

  1. 什么是ADIL?
  2. 如何定义AIDL?
  3. ADIL做了什么?
  4. 使用ADIL传递系统基本数据

 

什么是AIDL?

  先来回顾一下,Android在本地的Service中如何与其它组件进行交互的,首先Service必须实现其onBind()方法,然后在onBind方法传递一个IBinder接口的实现,而在其它组件中使用bindService()绑定一个服务,再通过其中的参数ServiceConnection对象获取到Service中定义的IBinder接口的实现。那么与Service进行数据交互,其实就是传递一个IBinder,通过这个IBinder进行交互。

  而现在就碰到一个问题,在同一个进程中,是可以获取到这个Service类的,也就可以获得这个Service中定义的IBinder,但是如果在不同的应用中,即远程服务,如何获取IBinder呢?仅仅是在不同的应用定义一相同的类是没有用的,所以Android为我们提供了AIDL语言,它需要先定义一个远程调用接口,然后为该接口提供一个实现类,通过共享这个远程调用接口来达到进程间数据交互的目的,而这个接口的代码是有很多共性的,并且编写过程相当枯燥乏味,所以Android开发者为我们提供了ADIL来简化通讯接口的开发。

  AIDL(Android Interface Definition Language)是Android远程调用接口的定义语言。它有它自己的一套语法规范,但是和Java类似,这并不难理解,详细的这个会后面介绍。而当你定义好一个AIDL接口之后,你会发现在gen/目录下,多出一个与定义的AIDL包名相同,文件名相同的一个Java类,这个类是编译器根据定义的AIDL接口自动生成的代码,观察之后发现其实它也是继承了Binder类(Binder是IBinder的实现类),所以它可以通过ServiceConnection进行数据传递。Service只需要暴露这个AIDL接口给客户端,让客户端也定义它,这样两个应用进程就可以通讯了。

如何定义AIDL?

  AIDL的语法与Java接口的语法非常相似,但是存在一些差异:

  1. AIDL定义接口的源代码后缀必须以.aidl结尾。
  2. AIDL一样要指定AIDL接口的包信息package *。
  3. AIDL接口无需指定public、private、protected等作用域,可以理解为就是public。
  4. AIDL默认情况下只能传递基本类型、String、List、Map、CharSequence。
  5. 如果需要传递其他类型的对象,需要import对象的包名,并需要对对象进行特殊处理(之后会介绍)。

  例如:

  1. package com.example.aidlservicedemo.domain;  
  2.  
  3. interface IDog{  
  4.     String getName();  
  5.     int getAge();      
  6. }  



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