——服务端——
服务端定义AIDL接口:例如:A.aidl,它的位置也在service所在目录,ADT会在该目录下生成一个A.java接口,接口里包含了一个stub内部类,其实现了A和IBinder(普通Service被调用时都要通过它来回调以传输数据)两个接口,它来作为远程Service回调类。
A.aidl格式如下:
interface A{
String getxxx();
double getxxx();
...
}
在Service实现类的内部,需要定义一个类继承Stub,继承的类会同时实现接口A和接口IBinder(因为Stub接口实现了这两个接口)。
如下:
public class B extends Stub{
@override
public String getxxx(){
return xxx;
}
@override
public double getxxx(){
return xxx;
}
}
在Service实现类的oncreate()方法中:
onCreate(...){
...
B b=new B();
...
}
在Service实现类的onBind(…)方法中:
@override
public IBinder onBind(...){
return b;
}
也就是说:以继承Stub的A类代替了继承自Binder类的类,以它来实现回调。
——客户端——
客户端也需要xxx.aidl,要将之前服务端定义的A.aidl复制到客户端中。同时,在ServiceConnection类的onServiceConnected方法中:
A a=A.Stub.asInterface(service);//注意a是A的引用,而不是Stub子类的引用
其它地方一样。