跨进程通信之AIDL服务(概述)

服务(Service)是android系统中非常重要的组件。Service可以脱离应用程序运行。也就是说,应用程序只起到一个启动Service的作用。一但Service被启动,就算应用程序关闭,Service仍然会在后台运行。

android系统中的Service主要有两个作用:后台运行和跨进程通讯

后台运行就不用说了,当Service启动后,就可以在Service对象中 运行相应的业务代码,而这一切用户并不会察觉。

如果想让应用程序可以跨进程通讯,就要使用我们这节讲的AIDL服 务,AIDL的全称是Android Interface Definition Language,也就是说,AIDL实际上是一种接口定义语言。通过这种语言定义接口后,Eclipse插件(ODT)会自动生成相应的Java代码接 口代码。

AIDL服务实现IPC的基本步骤

  1. ** 创建.aidl文件**-该文件(YourInterface.aidl)定义了客户端可用的方法和数据的接口。 ( 如果aidl文件的内容是正确的,Eclipse插件会自动生成一个Java接口文件(*.java))

  2. ** 实现接口**-AIDL编译器从AIDL接口文件中利用Java语言创建接口,该接口有一个继承的命名为Stub的内部抽象类(并且实现了一些IPC调用的附加方法),要做的就是创建一个继承于YourInterface.Stub的类并且实现在.aidl文件中声明的方法

  3. 向客户端公开接口-如果是编写服务,应该继承Service并且重载Service.onBind(Intent) 以返回实现了接口的对象实例

AIDL能支持的数据类型

AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。重要的是必须导入所有非内置类型,哪怕是这些类型是在与接口相同的包中。下面是AIDL能支持的数据类型:

  • Java编程语言的基本类型 (int, boolean等) — 不需要 import 语句

  • 以下的类 (不需要import 语句):

String

List -列表中的所有元素必须是在此列出的类型,包括其他AIDL生成的接口和可打包类型。List可以像一般的类(例如List<String>)那样使用,另一边接收的具体类一般是一个ArrayList,这些方法会使用List接口。

Map - Map中的所有元素必须是在此列出的类型,包括其他AIDL生成的接口和可打包类型。一般的maps(例如Map<String,Integer>)不被支持,另一边接收的具体类一般是一个HashMap,这些方法会使用Map接口。

CharSequence -该类是被TextView和其他控件对象使用的字符序列。

  • 通常引引用方式传递的其他AIDL生成的接口,必须要import 语句声明

  • 实现了Parcelable protocol 以及按值传递的自定义类,必须要import 语句声明。

    在创建 .aidl 文件的过程中,应该注意一旦 method 有参数,则需注意在前面加上 in, out 或 inout,它们被称为 directional tag,但是对于基本类型的参数,默认就是 in,并且不会是其他值。

调用远端接口(调用IPC方法)的步骤

  1. 声明.aidl文件中定义的接口类型的变量
  2. 实现ServiceConnection
  3. 调用Context.bindService(),传递ServiceConnection的实现
  4. 在ServiceConnection.onServiceConnected()方法中会接收到IBinder对象,调用YourInterfaceName.Stub.asInterface((IBinder)service)将返回值转换为YourInterface类型
  5. 调用接口中定义的方法。应该总是捕获连接被打断时抛出的DeadObjectException异常,这是远端方法唯一的异常
  6. 调用Context.unbindService()断开连接

使用可打包接口传递参数

如果有类想要能过AIDL在进程之间传递,这一想法是可以实现的,必须确保这个类在IPC的两端的有效性,通常的情形是与一个启动的服务通信。

使类能够支持Parcelable的4个步骤:

  1. 使该类实现Parcelabel接口
  2. 实现public void writeToParcel(Parcel out) 方法,以便可以将对象的当前状态写入包装对象中
  3. 增加名为CREATOR的构造器到类中,并实现Parcelable.Creator接口
  4. 最后,但同样重要的是,创建AIDL文件声明这个可打包的类,如果使用的是自定义的编译过程,那么不要编译此AIDL文件,它像C语言的头文件一样不需要编译。

Android的Binder的框架

Android Binder框架分为服务器接口、Binder驱动、以及客户端接口;简单想一下,需要提供一个全局服务,那么全局服务那端即是服务器接口,任何程序即客户端接口,它们之间通过一个Binder驱动访问。

服务器端接口:实际上是Binder类的对象,该对象一旦创建,内部则会启动一个隐藏线程,会接收Binder驱动发送的消息,收到消息后,会执行Binder对象中的onTransact()函数,并按照该函数的参数执行不同的服务器端代码。

Binder驱动:该对象也为Binder类的实例,客户端通过该对象访问远程服务。

客户端接口:获得Binder驱动,调用其transact()发送消息至服务器

参考:http://blog.csdn.net/lmj623565791/article/details/38461079#t9; http://www.cnblogs.com/over140/archive/2011/03/08/1976890.html

转载于:https://my.oschina.net/fltsp/blog/710200

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值