《深入理解Android:Telephony原理剖析与最佳实践》一3.3 AIDL跨应用服务

3.3 AIDL跨应用服务

Android Telephony框架层提供了一些AIDL系统服务以及第三方应用,通过这些系统服务可方便地获取手机当前状态,如待机状态、通话中、来电等,这些状态在Android手机应用开发中非常重要。如果我们开发一款Android平台的手机音乐播放器,在使用音乐播放器的过程中需要知道手机当前是什么状态,如果是通话中或来电,这时就必须暂停播放音乐。

3.3.1 AIDL概念分析

什么是AIDL呢?AIDL的Android官方定义如下:
AIDL (Android Interface Definition Language) is similar to other IDLs you might have worked with. It allows you to define the programming interface that both the client and service agree upon in order to communicate with each other using interprocess communication (IPC). On Android, one process cannot normally access the memory of another process. So to talk, they need to decompose their objects into primitives that the operating system can understand, and marshall the objects across that boundary for you. The code to do that marshalling is tedious to write, so Android handles it for you with AIDL.
AIDL(Android Interface Definition Language,Android 接口定义语言) Android系统平台的接口定义语言与您可能已经使用过的其他IDLs接口定义语言相似。程序员可以利用AIDL自定义编程接口,在客户端和服务端之间实现进程间通信(IPC)。在Android平台上,一个进程通常不能访问另外一个进程的内存空间,因此,Android平台将这些跨进程访问的对象分解成操作系统能够识别的简单对象, 并且为跨应用访问而特殊编排和整理这些对象。用于编排和整理这些对象的代码编写起来非常冗长,所以Android的AIDL提供了相关工具来自动生成这些代码供程序员使用。
根据前面对AIDL的概念分析,本例创建两个Android APK应用,一个应用作为AIDL服务提供方,而另外一个应用作为AIDL服务调用方,这样才能体现出AIDL跨应用服务访问。首先开始编写AIDL服务提供方。

3.3.2 AIDL服务提供方

先进入AIDL服务提供方的工程,创建.adil文件。本例中,在com.myandroid.aidl包下定义了一个IMyService.aidl文件,它仅有一个接口helloAndroidAIDL,形参为String name,返回String对象。代码如下:

package com.myandroid.aidl;
interface IMyService {
    String helloAndroidAIDL(String name);
}

Eclipse ADT开发插件安装正确以及AIDL文件定义正确的情况下,ADT开发插件会在工程中gen目录下创建对应的IMyService.java文件,其包路径与AIDL文件定义的路径一致,为com.myandroid.aidl。
注意 不难发现,AIDL接口定义语言与Java语言非常相似;另外,可以定义一些复合的数据类型,本例中使用Java基本的数据类型,感兴趣的读者可以上网查阅Android Parcel。
接着实现helloAndroidAIDL接口的逻辑实现,在AIDL接口定义文件一致的包路径com.myandroid.aidl下创建MyService类,继承android.app.Service类,并有一个内部类实现了IMyService.Stub接口,具体代码如下:

public class MyService extends Service {
    // 内部类MyServiceImpl,继承了AIDL工具生成的IMyService.Stub接口,主要实现之前定义的//接口helloAndroidAIDL
    public class MyServiceImpl extends IMyService.Stub {
        @Override//helloAndroidAIDL接口具体实现,在服务端输出日志,返回字符串
        public String helloAndroidAIDL(String name) throws RemoteException {
            System.out.println("helloAndroidAIDL:" + name);
            return "AIDL MyService return value";
        }
    }
    @Override
    public IBinder onBind(Intent intent) {//AIDL固定写法
        return new MyServiceImpl();//返回IMyService.Stub子类对象
    }
}

实现MyService类后,还需要对此AIDL服务进行配置,以便Android平台能识别此服务。打开AndroidManifest.xml文件开始配置,在application节点里加入如下xml配置信息:

<service android:name="com.myandroid.aidl.MyService">//名称需要和我们实现的Java代码//类名称保持一致
    <intent-filter>
        <action android:name="com.myandroid.aidl.IMyService" />//一般采用实现的Java
                                    //代码类名称,方便开发者理解和记忆并且名称不容易重复
    </intent-filter>
</service>

最后发布并运行此Android Project,在Eclipse中单击此Android Project,然后单击右键弹出菜单选项,进入Run As,选择Android Application,接着会启动Android虚拟设备,并会将此工程发布在启动的Android虚拟设备上运行。
Android提供的AIDL工具非常方便,会在很短的时间内完成AIDL服务端框架。接下来进入AIDL调用方代码实现。

3.3.3 AIDL服务调用方

首先建立AIDL服务调用方的Android Project,AIDL的调用主要有三大步骤:
步骤1 将AIDL服务端生成的Java文件com/myandroid/aidl/IMyService.java复制到本工程,尽量不要改变其包路径和文件名,这样客户端也就知道服务端具有什么样的能力,即AIDL服务端的接口定义。
步骤2 编写代码绑定服务,获取ADIL服务对象。
步骤3 通过AIDL服务对象完成AIDL接口调用。
首先在需要调用Activity中定义IMyService myService服务调用对象,然后创建serviceConnection对象,服务绑定相关代码如下:

private ServiceConnection serviceConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName name, IBinder service) {
        // 获得AIDL服务对象
        myService = IMyService.Stub.asInterface(service);
        button2.setEnabled(true);
    }
    public void onServiceDisconnected(ComponentName name) {
    }
}
//绑定服务,此代码可放入特定事件或一些触发事件
Intent intent = new Intent("com.myandroid.aidl.IMyService");
bindService(intent, serviceConnection,
                        Context.BIND_AUTO_CREATE);
AIDL服务调用代码如下:
String msg = myService. helloAndroidAIDL("Other Application");
Toast toast = Toast.makeText(AidlClient.this, msg, Toast.LENGTH_SHORT);
toast.show();

调用服务端的helloAndroidAIDL方法,服务端会打印出“helloAndroidAIDL: Other Application”日志,调用端通过Toast显示服务端返回String,内容为“AIDL MyService return value”。这样,AIDL服务端和客户端完成了完整交互流程。
注意 本例的AIDL服务调用与AIDL提供的系统服务调用方式不太一样,Android系统服务调用不需要程序员绑定服务,而直接获取系统服务对象即可调用其服务接口;在Android SDK级别上的开发无法实现系统服务,只有在修改Android源代码时可实现自己的系统服务,详细内容在后面的章节讲述。

时间: 2024-09-12 09:42:27

《深入理解Android:Telephony原理剖析与最佳实践》一3.3 AIDL跨应用服务的相关文章

《深入理解Android:Telephony原理剖析与最佳实践》一导读

前 言 随着ICT技术的推广和发展,在三网融合.智慧的地球(物联网)等概念风行的形势下,手机终端技术的发展和进步可谓日新月异:Android经受住了市场的考验,并占据了较大的市场份额,从手机芯片厂家.手机生产厂家到各种应用开发公司.互联网公司等,逐步形成了以Android系统平台为核心的上下游产业链.正是由于Android源代码的开源,各大手机厂商才能通过深度定制Android系统平台,在降低研发成本的同时,快速推出具有自身特色的Android智能手机产品.因此,各大手机厂家在推出新版本Andr

《深入理解Android:Telephony原理剖析与最佳实践》一第3章 主要技术准备

第3章 主要技术准备 第2章介绍了搭建Android源码编译环境以及Android相关常用工具使用的一些技巧和总结,接下来我们是不是应该开始学习Android Telephony相关内容了呢?先不着急,工欲善其事,必先利其器,我们还要做一些的技术准备工作,也就是学习Android Telephony涉及的一些关键技术,其中包括Handler消息处理机制.AIDL跨应用服务访问和Broadcast系统广播.这些技术在Telephony中使用较多,所以在学习Telephony前,需要对这几个重点技术

《深入理解Android:Telephony原理剖析与最佳实践》一3.4 广播

3.4 广播 广播(Broadcast),看字面意思可以联想到车站.商场等都有广播,对于广播来说,发送方并不需要知道广播接收方的数量及接收到广播如何反应,这些都是接收方的事.那么,在Android 平台中的广播是否与生活中的广播相似呢?答案是肯定的,发送方仅需要将广播内容完成发送,而接收方过滤自己需要的广播信息和内容,然后进行处理,接收方信息是发送方不知道的. 3.4.1 Android 系统中的广播 Android 系统中有非常多的广播,当系统启动或应用运行时便会向 Android 注册各种广

《深入理解Android:Telephony原理剖析与最佳实践》一1.3 Android Telephony框架结构

1.3 Android Telephony框架结构 前面对Android手机操作系统整体框架结构及每一层进行了简单的分析和说明,相信大家对Android智能手机操作系统有了一些基本的了解和认识.结合前面Android的系统整体框架,我们接着学习Android Telephony涉及的框架结构,如图1-3所示. 通过图1-3所示不难发现Android Telephony框架结构的一些规律,总结如下. Android Telephony的业务应用跨越了AP和BP.AP与BP相互通信,符合前面介绍的智

《深入理解Android:Telephony原理剖析与最佳实践》一3.5 本章小结

3.5 本章小结 本章主要对Android Telephony相关模块使用到的一些关键技术进行了分析和实例讲解,包括Handler.Broadcast两种异步通信的机制和AIDL跨应用的服务调用.Handler主要有几种消息处理方式?Handler对象的创建在主线程和子线程有什么区别?AIDL如何定义接口?AIDL接口定义完成后,对应的代码是如何生成的?Broadcast接收方的过滤器有几种设置方式?通过本章的学习,相信大家都对这些知识点会有较深入的认识和理解. 对Android中的Handle

《深入理解Android:Telephony原理剖析与最佳实践》一3.1 何为同步和异步

3.1 何为同步和异步 Android Telephony相关应用中,Telephony大量使用了Handler.Broadcast等通信方式,而在Android操作系统平台中的Handler消息处理.Broadcast广播消息等均采用异步通信机制,那么我们首先要清楚什么是异步通信机制,与它相对同步的通信机制是什么,有什么区别. Synchronous(同步)和Asynchronous(异步)的概念最早来自通信领域. 通信的同步:指客户端在发送请求后,必须要在服务端有回应后客户端才继续发送其他请

《深入理解Android:Telephony原理剖析与最佳实践》一第2章 搭建Android源代码编译环境

第2章 搭建Android源代码编译环境 第1章介绍了Android以及其Telephony功能模块的基本结构,在本章中将带着读者去搭建Android编译环境.即使你已经能够在自己计算机上成功编译Android源代码了,也希望你能阅读本章内容,因为本章不乏一些技巧的总结和Android相关实用工具使用方法的介绍. Android的编译环境作为深入学习Android的基础,不可缺失,能够成功下载Android源代码并编译成功,对深入学习Android是非常关键和重要的一步:Android环境搭建比

《深入理解Android:Telephony原理剖析与最佳实践》一2.1 Ubuntu Linux操作系统及工具安装

2.1 Ubuntu Linux操作系统及工具安装 要搭建Android的编译环境,首先要选择好使用什么操作系统.本书选择Ubuntu 10.10桌面版64位Linux操作系统作为编译Android源码的操作系统. 注意 为什么选择使用64位Ubuntu 10.10桌面版的操作系统呢?在搭建Android源代码编译环境的过程中通过对比Ubuntu 10版本和11版本,发现Ubuntu 10更加简单,比如在Ubuntu 11.10采用的GCC和G++ 4.6版本,需要回退到4.4版本,否则会出现编

《深入理解Android:Telephony原理剖析与最佳实践》一第1章 初识Android

第1章 初识Android Android中文意思为"机器人",中文翻译为"安卓",是Google于2007年11月5日发布的基于Linux平台的开源手机操作系统的名称.该平台由操作系统.中间件.用户界面和应用软件组成,被称为首个为移动终端打造的真正开放和完整的移动软件.Google与电信运营商.手机设备制造商.芯片开发商以及其他有关方面结成深层次的合作伙伴关系,希望借助建立标准化.开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统. 从2007年到现在