android之Service介绍之二 AIDL
来源:互联网 发布:网络指纹考勤机 实时 编辑:程序博客网 时间:2024/04/28 07:32
首先描述下我们想要实现的内容,我们希望在一个应用中通过点击按钮,去操作另一个进程中应用的音乐播放功能。
如图,我们点击“播放”时,系统就会去远程调用我们提供的一个service(与当前service不是同一个应用哦),然后操作service中的音乐播放,点击“停止”则会终止播放。想要重新播放的话,必须先点“销毁service”,再点播放按钮哦。(至于这里为什么要先点销毁按钮才能播放,完全是为了给大家展示下,远程调用service时,怎么去解绑service)。
在这个例子中,我们用到了一个非常重要的概念,AIDL。
AIDL(android interface definition language)android接口描述语言,其主要的作用就是允许我们在不同的进程间进行通信。
我们都知道每个应用程序都运行在各自的进程中,并且android平台是不允许不同进程间进行直接的对象数据等传递的。如果我们非要进行进程间的通讯,那么我们就必须将我们的数据对象分解成一个个微小的、可以被操作系统理解的数据单元,然后有序的通过进程边界的检查。
如果让我们自己实现,那么这个过程都愁死一批批的程序人了。幸好android,为我们解决了这个问题,这就是AIDL出现的原因了。
AIDL (Android Interface Definition Language)是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。
AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。
注意:AIDL只支持方法,不能定义静态成员,并且方法也不能有类似public等的修饰符;AIDL运行方法有任何类型的参数和返回值,在java的类型中,以下的类型使用时不需要导入包(import),基本数据类型、String、Map、List.当然为了避免出错,建议只要使用了,就导入包。
-------------------------------------------------------------------------------
使用AIDL的步骤:
服务端(提供服务):
第一步:定义一个*.aidl文件,该文件里是符合aidl语言规范的接口定义,里面定义了外部应用可以访问的方法。当我们保存该文件的时候,eclipse会自动为我们在gen文件夹下生成一个相应的java接口文件。例如RemoteServiceInterface.java
第二步:定义一个自己的service, 并将其注册到androidManifest.xml文件中,例如:
<service android:name="MyRemoteService">
<intent-filter>
<action android:name="cn.com.chenzheng_java.remote"/>
</intent-filter>
</service>
注意这里一定要提供一个intent-filter,我们的客户端进程就是通过该action访问到服务端进程的哦。
我们都知道,在实现自己的service时,为了其他应用可以通过bindService来和我们的service进行交互,我们都要实现service中的onBind()方法,并且返回一个继承了Binder的内部类;在这里,eclipse自动为我们生成的RemoteServiceInterface.java中有一个实现了Binder的内部类,RemoteServiceInterface.Stub。AIDL要求我们,在这里不能再直接去实现Binder类了,而是去实现,AIDL提供给我们的Stub类。 实现stub类的同时,AIDL还要求我们同时实现我们在接口中定义的各种服务的具体实现。至此为止,我们的服务端已经和我们的aidl文件绑定到一起了哦。
客户端:
第一步:客户端要想使用该服务,肯定要先知道我们的服务在aidl文件中到底对外提供了什么服务,对吧?所以,第一步,我们要做的就是,将aidl文件拷贝一份到客户端的程序中(这里一定要注意,包路径要和服务端的保持一致哦,例如服务端为cn.com.chenzheng_java.remote.a.aidl,那么在客户端这边也应该是这个路径)。
第二步:我们都知道,想要和service交互,我们要通过bindService方法,该方法中有一个ServiceConnection类型的参数。而我们的主要代码便是在该接口的实现中。
第三步:在ServiceConnection实现类的onServiceConnected(ComponentName name, IBinder service)方法中通过类似remoteServiceInterface = RemoteServiceInterface.Stub.asInterface(service);方式就可以获得远程服务端提供的服务的实例,然后我们就可以通过remoteServiceInterface 对象调用接口中提供的方法进行交互了。(这里的关键是通过*.Stub.asInterface(service);方法获取一个aidl接口的实例哦)
我们前面在服务端中说过了,必须提供一个intent-filter来匹配请求是否合法,所以我们在客户端访问服务的时候,还必须传递包含了匹配action的Intent哦。
--------------------------------------------------------------------------------------
下边整体是代码:
远程服务端:
RemoteServiceInterface.aidl
MyRemoteService.java
RemoteServiceActivity.java
androidManifest.xml
客户端:
activity代码:
music.xml
其他没有粘贴出来的代码都是由系统默认生成的。
- android之Service介绍之二 AIDL
- android之Service介绍之二 AIDL
- android之Service介绍之二 AIDL
- Android Service 之 AIDL
- Android-service之aidl
- android之Service介绍之三 AIDL与传递对象
- android之Service介绍之三 AIDL与传递对象
- android之Service介绍之三 AIDL与传递对象
- android之Service介绍之三 AIDL与传递对象
- android之Service介绍之三 AIDL与传递对象
- Android学习--Service之AIDL
- Android Service学习之AIDL
- Android-Service组件之AIDL
- Android服务之Service(二):关于AIDL进程间通信
- 初识Android之(二)- 实现Service AIDL小Demo
- Android的Service与BroadcastReceiver之二 跨进程调用Service(AIDL Service)
- android之Service介绍之四 如何传递复杂数据的AIDL服务
- Android 之 AIDL 和远程 Service 调用
- <WP7>解析json数据(初用json.Net)
- 窗体透明、窗体上控件和DC绘图不透明
- C#获取当前运行文件的文件名???
- js获取时间
- cookies读写
- android之Service介绍之二 AIDL
- 专业测量串口收发数据时间软件
- IPhone开发之C基础(三)
- vim——笔记
- android之Service介绍之三 AIDL与传递对象
- C语言分布式系统中的进程标识
- 解决SQL server 2005 数据库只能用计算机名连接不能用IP地址的问题
- oracle 学习笔记 之 oracle 体系与结构
- linux cpu affinity demo