Android Interface definition language(AIDL)
是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。
对于Service组件而言,它只有在绑定模式下才可以与客户端进行时交互。但是对于绑定服务传递数据,只局限于本地服务,无法使用服务进行跨进程间的交互。如果需要用到跨进程交互的话,需要用到一个新的技术——AIDL。
具体使用步骤:androidsdk/docs/guide/components/aidl.html
1、
创建aidl文件,aidl文件定义:写法跟java代码类似,但是这里有一点值得注意的就是它可以引用其它aidl文件中定义的接口,但是不能够引用你的java类文件中定义的接口。保存在src/目录,Service宿主和任何绑定这个服务的应用都需要。
-
private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
-
public int getPid(){
-
return Process.myPid();
-
}
-
public void basicTypes(int anInt, long aLong, boolean aBoolean,
-
float aFloat, double aDouble, String aString) {
-
// Does nothing
-
}
-
};
注:AIDL默认情况下只能传递基本类型、String、List、Map、CharSequence。若需要传递其他复杂类型的对象,需要import对象的包名, 定义数据接口的AIDL文件中,使用parcelable关键字,在其数据实现类中实现Parcelable接口,并实现对应的方法。
2、 编译aidl文件,若是在eclipse中开发,adt插件会像资源文件一样把aidl文件编译成java代码生成在gen文件夹下,不用手动去编译。
3、 实现我们定义aidl接口中的内部抽象类Stub,Stub类继承了Binder,并继承我们在aidl文件中定义的接口,我们需要实现接口方法。注意Stub对象是在被调用端进程,也就是服务端进程,至此,完成aidl服务端的编码。
-
public class RemoteService extends Service {
-
@Override
-
public void onCreate() {
-
super.onCreate();
-
}
-
-
@Override
-
public IBinder onBind(Intent intent) {
-
// Return the interface
-
return mBinder;
-
}
-
-
private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
-
public int getPid(){
-
return Process.myPid();
-
}
-
public void basicTypes(int anInt, long aLong, boolean aBoolean,
-
float aFloat, double aDouble, String aString) {
-
// Does nothing
-
}
-
};
-
}
4、 客户端如何调用服务端得aidl描述的接口对象,通过实现Service.onBind(Intent)方法,该方法会返回一个IBinder对象到客户端,其实它就是用来在客户端绑定service时接收service返回的IBinder对象的。注意在客户端需要存一个服务端实现了的aidl接口描述文件,但是客户端只是使用该aidl接口,不需要实现它的Stub类,获取服务端得aidl对象后mService = AIDLService.Stub.asInterface(service);就可以在客户端使用它了,对mService对象方法的调用不是在客户端执行,而是在服务端执行。
-
IRemoteService mIRemoteService;
-
private ServiceConnection mConnection = new ServiceConnection() {
-
// Called when the connection with the service is established
-
public void onServiceConnected(ComponentName className, IBinder service) {
-
// Following the example above for an AIDL interface,
-
// this gets an instance of the IRemoteInterface, which we can use to call on the service
-
mIRemoteService = IRemoteService.Stub.asInterface(service);
-
}
-
-
// Called when the connection with the service disconnects unexpectedly
-
public void onServiceDisconnected(ComponentName className) {
-
Log.e(TAG, "Service has unexpectedly disconnected");
-
mIRemoteService = null;
-
}
-
};
阅读(1320) | 评论(0) | 转发(0) |