IPC的含义是指进程间通信或者跨进程通信,是两个进程之间进行数据的交流,AIDL就是其中一种方式,趁着今天星期六有空闲时间,就学习了一下,顺便做一下笔记。
这分为服务端和客户端两部分,服务器端创建一个Service,接着在客户端绑定这个服务,从而实现通信交互。
根据官方给出的文档,我们需要以下三步:
- 创建aidl文件
- 实现这个接口
- 把这个接口暴露给客户端
- 创建aidl文件
在自己的项目右击->New->Folder->AIDL File,在自己新建的AIDL文件里面,New一个AIDL,如下
package com.example.xing.aidldemo;
// Declare any non-default types here with import statements
interface IMyAIDL {
//自己定义的一个方法
int add(int num1,int num2);
}
- 实现这个接口
private IBinder iBinder = new IMyAIDL.Stub(){
@Override
public int add(int num1,int num2) throws RemoteException {
Log.d("TAG","收到远程的请求");
return num1+num2;
}
};
- 把接口暴露给客户端
public class IRemoteService extends Service {
/**
* 绑定时会执行
* @param intent
* @return
*/
@Nullable
@Override
public IBinder onBind(Intent intent) {
return iBinder;
}
private IBinder iBinder = new IMyAIDL.Stub(){
@Override
public int add(int num1, int num2) throws RemoteException {
Log.d("TAG","收到远程的请求");
return num1+num2;
}
};
}
在onBind中返回的iBinder,其实就是第二步中我们实现的接口,当客户端绑定service的时候,就返回iBinder,客户端通过这个iBinder就可以操作aidl接口了。
通过以上几步,AIDL的服务器就基本完成了。
现在到客户端的实现
创建跟服务器一样的aidl文件,包名和类名也保持一致
这个是服务端:
这个是客户端:
2.绑定服务器
private ServiceConnection conn = new ServiceConnection(){
//绑定上服务的时候
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//拿到远程的服务
iMyAidl = IMyAIDL.Stub.asInterface(iBinder);
}
//当服务断开的时候
@Override
public void onServiceDisconnected(ComponentName componentName) {
//回收资源
iMyAidl = null;
}
};
private void bindService() {
//获取服务端
Intent intent = new Intent();
//新版本必须显式Intent启动绑定服务
intent.setComponent(new ComponentName("com.example.xing.aidldemo","com.example.xing.aidldemo.IRemoteService"));
bindService(intent,conn, Context.BIND_AUTO_CREATE);
}
在onServiceConnected中,
IMyAIDL.Stub.asInterface(iBinder)返回的就是一个aidl接口,拿到这个接口之后,就可以调用接口里面定义的方法,例如我们之前定义的add(num1,num2).
最后注意
- 在服务器端注册声明service的时候,要加上这两句:
android:exported=”true”
android:process=”:remote”,
否则就呵呵了! - 在启动客户端之前,必须先启动服务端。
- 这个是在网上视频学习之后写,其实就是理顺一下视频的内容而已,重述一次如何使用而已!