AIDL概念:一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码
首先介绍一下简单的用法:
使用 AIDL 进行进程之间的通信时要先定义好 客户端 与 服务端.
服务端
定义:提供功能性服务组件所在的应用程序.
首先定义一个 AIDL 接口(AIDL 是进程之间通信的一种接口定义语言,若两个应用程序都遵从此接口,则两程序间可以无障碍交流,
就像两个人先声明交流使用英语还是汉语一样,当双方使用相同的标准的时候,他们就可以交流了)
1),创建类包 在此包下创建一个aidl文件 (例如: MyInterface.aidl)
package com.chen.aidl;
interface MyInterface{
//此处的接口不能声明除默认(default)之外的任何其它的访问权限,否则导致编译失败
String getString(int type);
}
当保存此文件之后,gen文件夹下会出现一个名为 com.chen.aidl 的包,其中包含一个 处理过的MyInterface.java 源文件
此源文件中包含了MyInterface接口和Stup抽象类.
public static abstract class Stub extends android.os.Binder implements
com.chen.aidl.MyInterface {}
由此部分可以看出Stup接口继承了Binder类,同时实现了自定义的接口
在此过程中你的MyInterface.java可能会报错(AIDL 源文件报错),导致此发生的情况可能是你的java编译环境版本过低, 在eclipse里设置 window-preferences-java-Compiler 中将jdk至少设置为1.6保存后 clean即可
2,) 创建Service子类,并在onBind()方法中返回自定义AIDL接口对象,其对象的获得方式为(如果不知道如何使用绑定Service,请参考博客中其他文章
使用绑定Service的方法实现简易播放功能
)
public IBinder myBinder=new MyInterface.Stub() {
//重写自定义接口的方法,并在其中指定进程间相互通信的详细过程
//详细过程:客户端调用服务端的此方法,向其中输入一个参数,服务端根据这个参数向客户端返回相应数据
//这只是简单的举个栗子
public String getString(int type) throws RemoteException {
switch(type){
case 1:
return "hello";
default:
return "world";
}
}
};
3)在应用清单文件中注册Service,同时声明Action
<service
android:name="com.chen.aidlservice.MyService"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="com.chen.aidlservice.MyService" />
</intent-filter>
</service>
好了,服务端写完了,现在开始写服务端
客户端
1)用同服务端相同的方式新建一个adil文件
2)实例化ServiceConnection接口对象,用来监听绑定组件之间的连接
与普通的绑定服务不同的是,在此onServiceConnected(ComponentName cName,IBinder service)方法中将第二个参数强转为.aidl接口对象
private MyInterface myInterface;
public void onServiceConnected(ComponentName name, IBinder service) {
myInterface = MyInterface.Stub.asInterface(service);
//调用此方法时,将获得服务器产生的IBinder myBinder对象,从而调用该对象中的方法
}
3)在适当的位置使用隐式意图绑定服务,通常在初始化时
Intent intent = new Intent("com.chen.aidlservice.MyService");
Context.bindService(intent, new MyServiceConnection(), BIND_AUTO_CREATE);
完成此步骤后就可以在任意位置通过getString()方法与服务端进行交流了