本文简单介绍一下aidl文件build所生成的文件。
首先我们先新建一个aidl文件,like this:
// IMyAidlInterface.aidl
package com.learn.cxx.learn;
// Declare any non-default types here with import statements
interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
}
很简单,系统会默认帮我们生成一个作演示用的方法。然后我们rebuild一下工程,在build/generated/source/aidl/debug/com.learn.cxx.learn目录下面就会生成一个名为IMyAidlInterface.java的文件。如下:
/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: /home/cxx/dev/android/workspace/Learn/app/src/main/aidl/com/learn/cxx/learn/IMyAidlInterface.aidl
*/
package com.learn.cxx.learn;
// Declare any non-default types here with import statements
public interface IMyAidlInterface extends android.os.IInterface {
/**
* Local-side IPC implementation stub class.
*/
public static abstract class Stub extends android.os.Binder implements com.learn.cxx.learn.IMyAidlInterface {
private static final java.lang.String DESCRIPTOR = "com.learn.cxx.learn.IMyAidlInterface";
/**
* Construct the stub at attach it to the interface.
*/
public Stub() {
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.learn.cxx.learn.IMyAidlInterface interface,
* generating a proxy if needed.
*/
public static com.learn.cxx.learn.IMyAidlInterface asInterface(android.os.IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin != null) && (iin instanceof com.learn.cxx.learn.IMyAidlInterface))) {
return ((com.learn.cxx.learn.IMyAidlInterface) iin);
}
return new com.learn.cxx.learn.IMyAidlInterface.Stub.Proxy(obj);
}
@Override
public android.os.IBinder asBinder() {
return this;
}
@Override
public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
switch (code) {
case INTERFACE_TRANSACTION: {
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_basicTypes: {
data.enforceInterface(DESCRIPTOR);
int _arg0;
_arg0 = data.readInt();
long _arg1;
_arg1 = data.readLong();
boolean _arg2;
_arg2 = (0 != data.readInt());
float _arg3;
_arg3 = data.readFloat();
double _arg4;
_arg4 = data.readDouble();
java.lang.String _arg5;
_arg5 = data.readString();
this.basicTypes(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5);
reply.writeNoException();
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements com.learn.cxx.learn.IMyAidlInterface {
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote) {
mRemote = remote;
}
@Override
public android.os.IBinder asBinder() {
return mRemote;
}
public java.lang.String getInterfaceDescriptor() {
return DESCRIPTOR;
}
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, java.lang.String aString) throws android.os.RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeInt(anInt);
_data.writeLong(aLong);
_data.writeInt(((aBoolean) ? (1) : (0)));
_data.writeFloat(aFloat);
_data.writeDouble(aDouble);
_data.writeString(aString);
mRemote.transact(Stub.TRANSACTION_basicTypes, _data, _reply, 0);
_reply.readException();
} finally {
_reply.recycle();
_data.recycle();
}
}
}
static final int TRANSACTION_basicTypes = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
}
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, java.lang.String aString) throws android.os.RemoteException;
}
代码很长,看着眼晕,上一张UML图:
UML画的不好,将就看一下。结构其实很清晰,继承关系我也不讲了。
我们在继承Service类实现自己的Service时,可重载onBind方法,并将一个ServiceClass实例作为返回值,onBind方法的返回类型是IBinder,显然,ServiceClass是可以作为返回值的。
在bindService时我们可以传入一个ServiceConnection对象,并获取到Service返回给我们的IBinder(也就是一个ServiceClass实例),然后通过Stub中的一个共有静态方法asInterface就可以将该IBinder对象转换为我们可以使用的IMyAidlInterface对象。我们通过操作IMyAidlInterface对象完成与服务端的通信。
以上。