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 binder c++层 - 回调客户端服务 - 客户端(c++层) 调用
  2. Phone双模修改涉及文件列表
  3. Android 读取文件File的大小
  4. Android屏幕截图并保存截取屏幕的图片到指定文件
  5. Android 编译App报错 找不到android.support.annotation.Keep的
  6. Android 编译提示R文件找不到
  7. 总结系列-Android的文件系统
  8. FregServer进程,封装进程间通信数据

随机推荐

  1. ASP.NET vs. PHP,哪个更快?
  2. LINUX主机名字规范
  3. linux mint 19安装 kvm 软件包
  4. 设置yum软件库轻松解决软件包安装问题
  5. linux 时间同步的2种方法(转)
  6. Linux input子系统学习总结(一)
  7. 【2017/4/13】centos或者linux安装完成后
  8. 对于Linux创建链接时终目录和文件处理的
  9. c语言起泡排序
  10. Linux:目录中的最新文件。