android的AIDL就是Android Interface definition language的缩写,用于在android内部进程间通信。
接下来的是简单说明AIDL的使用,在下载地址中,增加了一个跨应用的AIDL通讯调用方式,里面包含了复杂的数据类型的传递。
1、首先创建一个以.aidl为文件结尾的文件。
里面的forActivity.aidl和forAervice.aidl就是两个aidl文件,两个文件代表的意思为:
forAcitivty:由Service进程回调到Activity所在的主进程中;
forService:由Activity的主进程中回调到Service中。
两个类的代码分别为:
package com.example.android.aidl;
interface forActivity{
void performAction();
}
package com.example.android.aidl;
import com.example.android.aidl.forActivity;
interface forService {
void registerTestCall(forActivity cb);
void invokCallBack();
}
当创建完这两个文件后,在gen包下面会自动创建这两个文件对应的java文件。
2、接下来是要实现这两个interface。
实现你定义aidl接口中的内部抽象类Stub,public static abstract class Stub extends android.os.Binder implements com.cao.android.demos.binder.aidl.AIDLService
Stub类继承了Binder,并继承我们在aidl文件中定义的接口,我们需要实现接口方法,下面是我在例子中实现的Stub类:
private final forService.Stub mBinder = new forService.Stub() {
@Override
public void invokCallBack() throws RemoteException
{
callback.performAction();
mHandler.sendEmptyMessageDelayed(2000,10000);
}
@Override
public void registerTestCall(forActivity cb) throws RemoteException
{
callback = cb;
}
};
这个实现类会放在service中,而定义的mBinder是因为在Service中,会使用onBind方法,将mBinder反馈给接收者。
这个实现的stub是定义在服务端(Service中)。因为在stub中,是在一个独立的线程中,所以在调用UI或者其他地方时,需要使用Handler来传递,不然会出现一个线程异常。
3、怎么在客户端如何调用服务端得aidl描述的接口对象,doc只告诉我们需要实现Service.onBind(Intent)方法,该方法会返回一个IBinder对象到客户端,绑定服务时不是需要一个ServiceConnection对象么,在没有了解aidl用法前一直不知道它是什么作用,其实他就是用来在客户端绑定service时接收service返回的IBinder对象的:
private forService mService;
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = forService.Stub.asInterface(service);
try {
mService.registerTestCall(mCallBack);
} catch (RemoteException e) {
}
}
};
mService就是AIDLService对象,具体可以看我后面提供的示例代码,需要注意在客户端需要存一个服务端实现了的aidl接口描述文件,但是客户端只是使用该aidl接口,不需要实现它的Stub类,获取服务端得aidl对象后mService = AIDLService.Stub.asInterface(service);,就可以在客户端使用它了,对mService对象方法的调用不是在客户端执行,而是在服务端执行。
文章参考了:http://blog.csdn.net/stonecao/article/details/6425019
接下来是一个完整的例子:
http://pan.baidu.com/s/1kTE3Vi3
接下来是两个应用间的通信:
service应用:http://pan.baidu.com/s/1mgK75Qo
client应用:http://pan.baidu.com/s/1o6AuboA