最近项目中用到蓝牙打电话,需要调用AIDL实现,说实话,AIDL之前没有用过,其实不太会,于是网上搜索哈,算是知道怎么用了,具体实现原理还是不太懂,反正知道怎么用了。
原理:就是A程序定义一个AIDL文件,eclipse会自动编译生成class文件,然后在A程序的service里面实现AIDL接口,并且实现AIDL的方法,方法就是你要做什么的,比如打电话的….然后在B项目里面绑定A项目的service,然后就可以调用A项目service里面的方法了。其实就是不同进程之间的方法调用。
写个小DEMO:
实现步骤:
1,A程序定义AIDL叫Test,定义一个dosomething();
interface Test{
void dosomething();
}
2,A程序定义Service,实例化AIDL的接口,并且实现其方法,在onBind()返回实例化的AIDL;
public class Myservice extends Service {
// 初始化AIDL实现其方法,做某些事件
Test.Stub mStub = new Test.Stub() {
public void dosomething() throws android.os.RemoteException {
// AIDL的方法,做某些事件
};
};
@Override
public IBinder onBind(Intent intent) {
return (IBinder) mStub;// 该service绑定AIDL
}
}
3,也要将A程序定义好的AIDL copy到B项目;这里省略;**
4,B项目连接Service;
/**
* 链接service
*/
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
mTest = null;
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
mTest = Test.Stub.asInterface(arg1);
if (mTest == null) {
Toast.makeText(mContext, "bind service failed",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext, "bind service sucess",
Toast.LENGTH_SHORT).show();
}
}
};
5,B项目绑定Service;
// 绑定AIDL服务,两种方法
第一种代码直接启动service的方式绑定:
Intent intent = new Intent(MainActivity.this, Test.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);//绑定
startService(intent);//启动service
第二种在A项目的AndroidManifest.xml的Myservice 设置Action启动,根据Action启动对应的service
A项目:
<service android:name="com.test.Myservice"
android:process=":remote" >
<intent-filter>
<action android:name="**com.action.aidl**" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
B项目绑定sevice:
Intent intent = new Intent("**com.action.aidl**");
bindService(intent, connection, Context.BIND_AUTO_CREATE);
总之以上2种都是为了启动service,在service的onbind()方法里面绑定aidl,返回一个aidl
public IBinder onBind(Intent intent) {
return (IBinder) mStub;// 该service绑定AIDL
}
6,B项目调用A项目的dosomething()方法
// 调用AIDL的方法
mTest.dosomething();
还有一个很重要的一点,是A,B个项目存放AIDL的包名一定要相同,否则绑定AIDL成功,也吊不到对方的方法。
总结:ADIL就是两个不同的程序之间的一个桥梁,两个不同的程序通过绑定AIDL可以互相通讯。