AIDL(Android Interface Definition Language)
程序员可以利用AIDL来实现客户端和服务端的之间实现通信(IPC)。
看看下面的例子。本例创建两个apk应用,一个应用作为AIDL的服务提供方,而另外一个应用作为AIDL服务调用方。
AIDL服务提供方
首先进入服务提供方的工程,创建aidl文件。本例中,在com.myandroid.aidl包下定义了一个IMyService.aidl文件,它仅有一个接口helloAndroidAIDL,形参为String name,返回String对象。
package com.myandroid.aidl;
interface IMyService{
String helloAndroidAIDL(String name);
}
开发插件安装正确以及AIDL文件定义正确的情况下,ADT开发插件会在工程中gen目录下创建对应的IMyService.java文件,其包路径与AIDL文件定义的路径一致,为com.myandroid.aidl。
接着实现helloAndroidAIDL接口的逻辑实现,在AIDL接口定义文件一致的包路径com.myandroid.aidl下创建MyService类,继承android.app.Service类,并有一个内部类实现了IMyService.Stub接口,具体代码如下:
public class MyService extends Service{
public class MyServiceImpl extends IMyService.Stub{
@Override
public String helloAndroidAIDL(String name) throws RemoteException {
System.out.println("helloAndroidAIDL:"+name);
return "AIDL MyService return value";
}
}
@Override
publicd IBinder onBind(Intent intent){//AIDL固定写法
return new MyServiceImpl();//返回IMyService.Stub子类对象
}
}
实现MyService类后,还需要对此AIDL服务进行配置,以便Android平台能识别此服务。打开AndroidManifest.xml文件开始配置,在application节点里加入如下xml配置信息。
<service android:name="com.myandroid.aidl.MyService">
<intent-filter>
<action android:name="com.myandroid.aidl.IMyService" />
</intent-filter>
</service>
到此运行apk的时候,服务提供方已经完成。很简单。
AIDL服务调用方
生成一个AIDL服务端apk工程。然后按以下步骤实现AIDL服务调用方。
步骤1: 将AIDL服务端生成的Java文件 com/myandroid/aidl/IMyService.java复制到本工程,尽量不要改变其包路径和文件名,这样客户端也就知道服务端具有什么样的能力,即AIDL服务端的接口定义
步骤2:编写代码绑定服务,获取AIDL服务对象
步骤3:通过AIDL服务对象完成AIDL接口调用。
首先在需要调用Activity中定义IMyService myService服务调用对象,然后创建serviceConnection对象,服务绑定相关代码如下:
private ServiceConnection serviceConnection = new ServiceConnection(){
public void onServiceConnected(ComponentName name,IBinder service) {
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_SHOT);
toast.show();
调用服务端的helloAndroidAIDL方法,服务端会打印出”helloAndroidAIDL:Other Application”日志,调用端通过Toast显示服务端返回String,其内容为”AIDL MyService return value”。这样,AIDL服务端和客户端完成了完整交互流程。