前言
AIDL(Android Interface definition language)即Android接口定义语言。
项目实例
首先,准备两个应用,一个作为客户端,一个作为服务端。当然你也可以用一个应用实现,无非就是应用内跨进程和多应用跨进程的区别,原理是一样的。下面分别对每个端上需要操作的步骤进行说明。
服务端:
第一步:创建aidl接口定义文件
在你的服务端项目中,右键->New->AIDL->AIDL File,输入接口名称,然后as会自动在/src/main目录下生成aidl文件夹,路径与主项目/src/main/java目录一致。
这里我创建了一个IUserProxy.aidl文件,并自定义了如下几个接口
// IUserProxy.aidl
package com.xuhj.ipc.server;
// Declare any non-default types here with import statements
import com.xuhj.ipc.server.model.User;
interface IUserProxy {
List<User> getUserList();
void addUser(in User user);
}
如果用到自定义对象,比如我这里用到了一个User对象,则必须实现Parcelable接口,同时需要在aidl目录下新建一个aidl文件,进行该对象的声明。
PS: 这个User对象建议最好也放在aidl目录下,这样方便后面把aidl中的文件全部复制到客户端上来复用。
例如:这里我创建了一个User对象,则需要再创建一个User.aidl文件,并添加如下声明内容。
注意:这个User.aidl不要用自动生成aidl的方法去创建,需要自己手动新建New File,文件名为User.aidl
package com.xuhj.ipc.server.model;
parcelable User;
以上步骤完成后,对项目进行一次Build,会在/build/generated/source/aidl下生成对应的java文件,这就是我们刚才定义的IUserProxy.aidl转换后的java类,有兴趣可以查看相关资料。as只是帮我们自动完成了这个步骤,我们也可以完全自己写这个java类。
第二步:创建Service服务类
新建类AidlService并继承Service
public class AidlService extends Service {
private static final String TAG = "服务端:AidlService";
private Binder mBinder = new IUserProxy.Stub() {
@Override
public List<User> getUserList() throws RemoteException {
Log.d(TAG, "收到客户端的调用getUserList");
return null;
}
@Override
public void addUser(User user) throws RemoteException {
Log.d(TAG, "收到客户端的调用addUser");
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
最后别忘了在manifest中添加service声明。这里我用了action供其他应用调用。
<service android:name=".service.AidlService">
<intent-filter>
<action android:name="com.xuhj.action.ipc.server.AidlService" />
</intent-filter>
</service>
好啦,一个简单的服务端就这样创建完成了。
客户端:
第一步:复制aidl文件
把服务端的aidl文件全部复制到客户端相同目录下。这样保证客户端调用的和服务端调用的是一样的类。
第二步:创建ServiceConnection服务连接类
新建类AidlConn并继承ServiceConnection
public class AidlConn implements ServiceConnection {
private static final String TAG = "客户端:AidlConn";
private com.xuhj.ipc.server.IUserProxy mIUserProxy;
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mIUserProxy = com.xuhj.ipc.server.IUserProxy.Stub.asInterface(service);
try {
User sendUser = new User(77, "i am client");
Log.d(TAG, "调用addUser");
mIUserProxy.addUser(sendUser);
Log.d(TAG, "调用getUserList");
List<User> userList = mIUserProxy.getUserList();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
第三步:开启远程服务
在客户端的Activity中,开启远程服务
private void invokeIPCAidlFromServer() {
Intent i = new Intent();
i.setAction("com.xuhj.action.ipc.server.AidlService");
i.setPackage("com.xuhaj.ipc.server");
AidlConn aidlConn = new AidlConn();
bindService(i, aidlConn, BIND_AUTO_CREATE);
}
好了,一个简单的AIDL通信就这样完成了。
如果需要多个AIDL通信,可以通过BinderPool来管理,有兴趣可以查看相关资料。