DEMO地址:http://download.csdn.net/detail/u010532761/9383213
AIDL,全名Android Interface definition language,主要用于进程间通讯,是android寄予linux系统设计的自己的进程通讯方式(linux存在进程通讯方式)...闲话不多说,下面看代码:
1、新建个工程,做service提供端(类似于服务端)
1.1 新建个java 接口文件,写几个抽象方法,把里面的public static 全删掉,复制出来,改.java的后缀为.aidl,把java接口文件删了,aidl文件复制进去。
package com.kurt.aidl;
interface KurtAidl {
int getNum(int num);
String getString(String info);
}
如图:
1.2点击运行一下,gen目录下就生成了对应的编译文件。
然后写个service:
public class KurtServer extends Service {
@Override
public IBinder onBind(Intent intent) {
return mybind;
}
public KurtAidl.Stub mybind = new KurtAidl.Stub() {//gen目录中会生成对应aidl的Stub方法,调用这个方法,把aidl中的抽象方法实现,记得抛出RemoteException
@Override
public int getNum(int num) throws RemoteException {
return num * 2;
}
@Override
public String getString(String str) throws RemoteException {
return str + str;
}
};
}
1.3在IBinder方法中返回这个方法对象
1.4 在清单文件中注册这个service,过滤器中设置个action。
2 开始写一个工程去测试通过aidl与对方app通讯。
2.1把aidl文件连包名一起考过去~build一下,在gen目录生成对应文件
在需要调用的地方 new 一个serviceConnection类
public ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
aidl = KurtAidl.Stub.asInterface(service);
}};
2.2 通过intent 调用对方service
Intent intent = new Intent();
intent.setAction("com.kurt.cobain");//对方service的action
bindService(intent, conn,Context.BIND_AUTO_CREATE);
2.3 调用service中的方法:
try {
int a = aidl.getNum(10);
String str = aidl.getString("Kurt-");
Toast.makeText(MainActivity.this, str + a,Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
e.printStackTrace();
Log.e("NIRVANA", "ERROR");
}
这里有一个需要注意的地方,不要在同一个方法中同时执行bindservice 和 调用对方service中的方法,可能会报aidl空指针。因为链接是需要时间的,虽然几乎也是瞬间完成,但是很可能执行方法抢到连接完成操作之前执行。