AIDL:它主要是用来帮助我们跨进程通信的。
它的路径是:app->build->generated->source->aidl->debug下
AIDL通信流程:
1:首先创建客户端的aidl文件,同步工程后就会在相应的目录下生成对
应的.java文件。
2:创建服务接口文件:并在Manifest清单文件中注册服务
public class IRemoteService extends Service{//当客户端绑定到该服务时会调用
@Override
public IBinder onBind(Intent intent) {
return mIBinder;
}
private IBinder mIBinder= new MyAIDL.Stub() {
@Override
public int add(int num1,int num2)throwsRemoteException{
Log.d("TAG","收到了远程的请求,输入的参数是:"+num1+"和"+num2);
return num1+num2;
}
};
}
3:同时客户端也要创建对应的aidl文件,在软件创建的时候通过bindService()绑定
服务,在软件销毁时通过unBindService()销毁服务。
下面是绑定服务的代码:
//绑定服务
private voidbindService() {
//获取到服务端
Intentintent= newIntent();
//Android 5.0新版本必须通过显示Intent启动绑定服务
intent.setComponent(newComponentName("control.aidlstudy","control.aidlstudy.IRemoteService"));
bindService(intent,conn,Context.BIND_AUTO_CREATE);
}
绑定服务中的conn参数传入的是:ServiceConnection这个对象有两个方法如下:
privateServiceConnectionconn= newServiceConnection() {
//绑定上服务的时候
@Override
public voidonServiceConnected(ComponentNamename,IBinderservice) {
//得到远程服务
mMyAIDL=MyAIDL.Stub.asInterface(service);
}
//断开服务的时候
@Override
public voidonServiceDisconnected(ComponentNamename) {
//回收资源
}
};
以上就是服务端和客户端通信的过程。下面是点击事件进行的调用远程服务的代码:
public voidonClick(Viewv) {
//用户输入的两个数
intnum1=Integer.parseInt(et_num1.getText().toString());
intnum2=Integer.parseInt(et_num2.getText().toString());
Log.i(TAG,"onClick: num1="+num1+" num2="+num2);
try{
//调用远程的服务
int res=mMyAIDL.add(num1,num2);
Log.i(TAG,"onClick: res="+res);
et_res.setText(res+"");
}catch(Exceptione) {
e.printStackTrace();
et_res.setText("ERROR");
}
}