操作系统中,多个进程间进行通讯、共享资源实现系统功能平台,是非常基础和重要的功能应用;同时,进程通讯也是操作系统内核的重要功能部分。Linux操纵系统中,进程通讯一般使用传统的IPC(Inter-ProcessCommunication,IPC)模式,且IPC模式实现了共享内存、管道、消息队列和socket等等,虽然IPC模式广泛使用,但IPC模式中UID/PID数据是由应用程序填入,存在着可靠性差,容易被篡改,难于维护等问题。 AIDL(AndroidInterfaceDefinitionLanguage)是Android系统自定义的接口描述语言,是Android平台中实现进程间通讯方式一种,属轻量级通讯机制,有着实现简单、效率较高等优点。 1AIDL实现原理及过程 AIDL语言属于系统级原语,但语法结构和Java语言非常相似,AIDL中主要用于定义访问接口,无实现过程。与Java不同的是,AIDL允许定义函数参数传递的方向,AIDL中支持三种方向:in,out,inout。 标识为in的参数将从调用者传递到远程服务中; 标识为out的参数将从远程服务传递到调用者中; 标识为inout的参数将先从调用者传递到远程服务中,再从远程服务返回给调用者。 ADIL实现过程一般按以下步骤:(1)创建AIDL接口描述文件;(2)通过继承android.os.Iinterface接口实现远程服务AIDL接口的Java接口;(3)绑定和使用远程服务;(4)客户端调用。 AIDL通讯案例中,服务端一般由一个AIDL文件和一个IService实现接口及Service实现类组成,其中IService接口用于实现AIDL所定义的访问方法,且IService必须是android.os.Iinterface子接口,Service实现类则是AIDL接口具体的实现类。 1)定义如下AIDL文件如下: interfaceIService{ intgetAccountBalance(); intgetCustomerList(inStringbranch,outString[]customerList); } 2)Iservice接口的实现 在实现AIDL接口的Service接口其内部结构由三部分组成,1)内部静态抽象类Stub,Stub类及其子类在整个AIDL通讯中非常重要,是用于实现AIDL接口的实现类,Stub必须是Android.os.Binder的子类及IService的实现类。2)内部静态类Proxy,Proxy类属于是向远程服务提供调用接口类。3)是IService中实现的AIDL访问接口方法。Iservice接口部分代码如下所示: publicinterfaceIServiceextendsandroid.os.IInterface { publicstaticabstractclassStubextendsandroid.os.Binder{//Stub内部静态抽象类….. privatestaticclassProxyimplementscom.lifeblood.ITestService /内部静态类Proxy/……….. publicintgetAccountBalance(); publicintgetCustomerList(inStringbranch,outString[]customerList); //现的AIDL访问接口方法 3)TestService类的实现 TestService实现类,是Android中普通Service类Android.os.Service子类,是实现AIDL描述接口的重要实现类,但其实现过程有点特殊,是通过定义ItestService.Stub类型成员变量,实现Iservice接口中调用方法,也就是AIDL中定义的描述接口方法。 4)Activity类中启动Service服务 本案例中Service只是提供远程服务,无需在本地Activity中进行访问,所以使用Intent类启动Service即可,代码结构如下:Intentservice=newIntent(this,TestService.class); startService(service); 5)AndroidManifest.XML中的配置 AndroidManifest.XML文件的配置非常重要,远程服务时其他进程访问定位到服务,就是通过AndroidManifest文件的配置名称进行定位. 6)客户端进程调用 客户进程调用时与JNDI方式相似,通过实现ServiceConnection接口绑定远程服务,获取Service对象,从而实现调用,在客户端实例中也需拷贝AIDL接口文件。 2测试运行 程序运行步骤如下:首先运行TestService服务端;再运行AIDLClient客户端;点击绑定连接AIDL获取Service服务,并显示调用信息。效果如图1所示。 3结束语 本文对AIDL接口描述语言的语法结构及实现原理方式,以及在远程调用过程中AIDL的实现过程,及相关的配置方法进行了分析与探讨。AIDL是按面向对象的设计思想实现进程通讯,且AIDL语言符合Android平台中系统原语规则,为Android系统级开发过程中,进程间通讯提供了较为便利和简单访问模型。 |