什么是AIDL:
AIDL即android interface definition language--android接口定义语言(通过android系统底层间接通讯。AIDL基于service),用于进程之间的通信,进程之间为何不能直接通信,而需要一些机制呢?(当然是进程之间不能共享内存导致的咯(^_^) )
什么时候使用AIDL才恰到好处呢:
对android IPC的通信方法做个比较就可明白一二了
AIDL | Binder | message |
---|---|---|
多线程 | 没有多线程 | 没有多线程 |
多应用 | 多应用 | / |
开发环境
android studio
操作步骤:new->folder->AIDL 生成AIDL目录
从图片中可以看到不管是哪种目录,AIDL文件夹和java都是同级的(这点是和Eclipse是不同的),再将AIDL创建好之后,在android studio中一定要先编译一次,否则无法调用哦
实例:
最简单的计算题,求两个数的和……
在客户端输入两个数,要求在服务器端计算出两个数的和,然后将计算结果返回,哦哦,文字表达可能并不显而易见,来副图
新建一个工程,之后新建一个module,我这儿是clientaidl
服务端app
new->folder->AIDL Folder生成目录
新建一个aidl文件
// IMyAidlInterface.aidl
package com.vickay.aidltest;
// Declare any non-default types here with import statements
interface IMyAidlInterface {
//计算两个数的和
int add(int num1,int num2);
}
新建一个service,为啥?看博文开头
public class vickayService extends Service {
/**
* 当客户端绑定到该服务的时候 会执行onBind代码
* @param intent
* @return
*/
@Override
public IBinder onBind(Intent intent) {
return iBinder;
}
private IBinder iBinder = new IMyAidlInterface.Stub(){
@Override
public int add(int num1, int num2) throws RemoteException {
//Log.d("TAG","收到了来自客户端的请求,输入的参数是" + num1 + "和" + num2);
return num1 + num2;
}
};
}
在清单文件中记得注册该service
<service android:name=".vickayService"
android:enabled="true"
android:exported="true"
/>
客户端app
新建一个AIDL文件,要求和服务端的AIDL同包名,同名称(直接复制粘贴)
MainActivity.java
public class MainActivity extends Activity implements View.OnClickListener {
private EditText mNum1;
private EditText mNum2;
private EditText result;
private Button cal;
IMyAidlInterface iMyAidlInterface;
private ServiceConnection conn = new ServiceConnection() {
//当与服务端连接成功时
@Override
public void onServiceConnected(ComponentName name, IBinder iBinder) {
//拿到了远程的服务
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder);
}
//当与服务端断开连接时
@Override
public void onServiceDisconnected(ComponentName name) {
//回收资源
iMyAidlInterface = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//软件已启动就绑定服务
bindService();
}
private void initView(){
mNum1 = (EditText) findViewById(R.id.num1);
mNum2 = (EditText) findViewById(R.id.num2);
result = (EditText) findViewById(R.id.result);
cal = (Button) findViewById(R.id.cal);
cal.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int num1 = Integer.parseInt(mNum1.getText().toString());
int num2 = Integer.parseInt(mNum2.getText().toString());
int res;
try {
res = iMyAidlInterface.add(num1,num2);
result.setText(res + "");
} catch (RemoteException e) {
e.printStackTrace();
result.setText("远程调用错误");
}
}
private void bindService(){
//获取到服务端
Intent intent = new Intent();
//android5.0以后必须显示intent启动绑定服务
intent.setComponent(new ComponentName("com.vickay.aidltest","com.vickay.aidltest.vickayService"));
bindService(intent,conn, Context.BIND_AUTO_CREATE);
}
//当activity被销毁的时候解除绑定
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
}
最后在运行的时候,一定要保证服务端开启,否则会有空指针异常
AIDL还有其他的东西,下篇再记录
源码下载
如记录有误,欢迎指正!!!