1). development/samples/ApiDemos/src/com/example/android/apis/app/
*.aidl, Localservice**.java RemoteService*.java, ServiceStartArguments*.java

2). 深入解析Android 的AIDL Interface (高焕堂)
http://wenku.baidu.com/view/920f92ea998fcc22bcd10d28.html

3). http://wzw19191.blog.163.com/blog/static/131135470201051675520369/

在android中,进程通讯是通过aidl机制来完成的。aidl模型如下:

|<--------------------aidl---------------------->|
client端 -->proxy ----------parcel数据包-------- stub<---server端
也就是说:proxy+parcel+stub构成了aidl.只不过,proxy运行在客户进程,而 stub运行在服务端进程。当你通过aidl去访问服务端时,客户端会阻塞在proxy,服务端处理完后,通知proxy返回。

补充1:
应用程序获取相关服务的代码:
private AlarmManager getAlarmManager() {
synchronized (sSync) {
if (sAlarmManager == null) {
IBinder b = ServiceManager.getService(ALARM_SERVICE);
IAlarmManager service = IAlarmManager.Stub.asInterface(b);
sAlarmManager = new AlarmManager(service);
}
}
return sAlarmManager;
}


补充2:
AIDL文件生成的java文件中的Stub 类。
public static abstract class Stub extends android.os.Binder implements
android.net.softap.ISoftApManager
{
private static final java.lang.String DESCRIPTOR = "android.net.softap.ISoftApManager";

/** Construct the stub at attach it to the interface. */
public Stub() {
this.attachInterface(this, DESCRIPTOR);
}

/**
* Cast an IBinder object into an ISoftApManager interface, generating a
* proxy if needed.
*/
public static android.net.softap.ISoftApManager asInterface(
android.os.IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iin = (android.os.IInterface) obj
.queryLocalInterface(DESCRIPTOR);
if (((iin != null) && (iin instanceof android.net.softap.ISoftApManager))) {
return ((android.net.softap.ISoftApManager) iin);
}
return new android.net.softap.ISoftApManager.Stub.Proxy(obj);
}

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_getApEnabledState: {
data.enforceInterface(DESCRIPTOR);
int _result = this.getApEnabledState();
reply.writeNoException();
reply.writeInt(_result);
return true;
}
case TRANSACTION_setApEnabled: {
data.enforceInterface(DESCRIPTOR);
boolean _arg0;
_arg0 = (0 != data.readInt());
boolean _result = this.setApEnabled(_arg0);
reply.writeNoException();
reply.writeInt(((_result) ? (1) : (0)));
return true;
}
case TRANSACTION_setApSettings: {
data.enforceInterface(DESCRIPTOR);
android.net.softap.SoftApConfigure _arg0;
if ((0 != data.readInt())) {
_arg0 = android.net.softap.SoftApConfigure.CREATOR
.createFromParcel(data);
} else {
_arg0 = null;
}
boolean _result = this.setApSettings(_arg0);
reply.writeNoException();
reply.writeInt(((_result) ? (1) : (0)));
return true;
}
case TRANSACTION_getApSettings: {
data.enforceInterface(DESCRIPTOR);
android.net.softap.SoftApConfigure _result = this
.getApSettings();
reply.writeNoException();
if ((_result != null)) {
reply.writeInt(1);
_result
.writeToParcel(
reply,
android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
} else {
reply.writeInt(0);
}
return true;
}
}
return super.onTransact(code, data, reply, flags);
}

private static class Proxy implements android.net.softap.ISoftApManager {
private android.os.IBinder mRemote;

Proxy(android.os.IBinder remote) {
mRemote = remote;
}


public android.os.IBinder asBinder() {
return mRemote;
}

public java.lang.String getInterfaceDescriptor() {
return DESCRIPTOR;
}

public int getApEnabledState() throws android.os.RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
int _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
mRemote.transact(Stub.TRANSACTION_getApEnabledState, _data,
_reply, 0);
_reply.readException();
_result = _reply.readInt();
} finally {
_reply.recycle();
_data.recycle();
}
return _result;
}

public boolean setApEnabled(boolean enable)
throws android.os.RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
boolean _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeInt(((enable) ? (1) : (0)));
mRemote.transact(Stub.TRANSACTION_setApEnabled, _data,
_reply, 0);
_reply.readException();
_result = (0 != _reply.readInt());
} finally {
_reply.recycle();
_data.recycle();
}
return _result;
}

public boolean setApSettings(
android.net.softap.SoftApConfigure datas)
throws android.os.RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
boolean _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
if ((datas != null)) {
_data.writeInt(1);
datas.writeToParcel(_data, 0);
} else {
_data.writeInt(0);
}
mRemote.transact(Stub.TRANSACTION_setApSettings, _data,
_reply, 0);
_reply.readException();
_result = (0 != _reply.readInt());
} finally {
_reply.recycle();
_data.recycle();
}
return _result;
}

public android.net.softap.SoftApConfigure getApSettings()
throws android.os.RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
android.net.softap.SoftApConfigure _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
mRemote.transact(Stub.TRANSACTION_getApSettings, _data,
_reply, 0);
_reply.readException();
if ((0 != _reply.readInt())) {
_result = android.net.softap.SoftApConfigure.CREATOR
.createFromParcel(_reply);
} else {
_result = null;
}
} finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}

static final int TRANSACTION_getApEnabledState = (IBinder.FIRST_CALL_TRANSACTION + 0);
static final int TRANSACTION_setApEnabled = (IBinder.FIRST_CALL_TRANSACTION + 1);
static final int TRANSACTION_setApSettings = (IBinder.FIRST_CALL_TRANSACTION + 2);
static final int TRANSACTION_getApSettings = (IBinder.FIRST_CALL_TRANSACTION + 3);
}

补充3:
通常服务程序该Stub类,也即间接继承了 android.os.Binder,进而可以作为 SystemManager.addService 等的参数而使用。

更多相关文章

  1. 【Android】配置文件属性说明
  2. Android获得全局进程信息以及进程使用的内存情况
  3. 在sd卡存储文件
  4. 读取raw文件下文件内容
  5. android Aidl 实现进程间通讯
  6. FregServer进程,获取ServiceManager代理对象
  7. android intent.setType指定浏览本地多种类型的文件

随机推荐

  1. Android程序有很多Activity,在B中如何关闭
  2. Android App 如何动态加载类
  3. android 使用基站 wifi定位
  4. Android全屏与非全屏问题
  5. Android Studio 第六十五期 - Android业
  6. Android开发之Android的原生库
  7. Android(安卓)L为什么不用Android(安卓)5
  8. Android 人脸识别
  9. Android(安卓)ApiDemos示例解析(141):Vie
  10. 告别Dagger2模板代码:DaggerAndroid原理解