您的位置:首页 > 移动开发 > Android开发

Android IPC之AIDL

2016-03-09 10:22 603 查看

什么是AIDL:

AIDL即android interface definition language--android接口定义语言(通过android系统底层间接通讯。AIDL基于service),用于进程之间的通信,进程之间为何不能直接通信,而需要一些机制呢?(当然是进程之间不能共享内存导致的咯(^_^) )


什么时候使用AIDL才恰到好处呢:

对android IPC的通信方法做个比较就可明白一二了

AIDLBindermessage
多线程没有多线程没有多线程
多应用多应用/

开发环境

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还有其他的东西,下篇再记录

源码下载

如记录有误,欢迎指正!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: