2010年4月25日 星期日

善用AIDL工具來產生IPC的介面溝通程式


在前一篇文章介紹利用AIDL來建立程序間的通訊,本篇將接續上一篇文章,來看看神奇的AIDL工具,在圖中有兩個重要的檔案:IRemoteService.aidl和IRemoteService.java,一個放在src目錄另一個放在gen目錄,換句話說AIDL工具會自動讀取IRemoteService.aidl來產生IRemoteService.java,如此可以減輕程式設計師的負擔。兩個程式列表如下:

1. IRemoteService.aidl

package com.example.RemoteServiceController;

interface IRemoteService {
int sum(int a, int b);
}

2. IRemoteService.java

/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: C:\\Documents and Settings\\user\\workspace\\RemoteServiceController\\src\\com\\example\\RemoteServiceController\\IRemoteService.aidl
*/
package com.example.RemoteServiceController;
public interface IRemoteService extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.example.RemoteServiceController.IRemoteService
{
private static final java.lang.String DESCRIPTOR = "com.example.RemoteServiceController.IRemoteService";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.example.RemoteServiceController.IRemoteService interface,
* generating a proxy if needed.
*/
public static com.example.RemoteServiceController.IRemoteService 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 com.example.RemoteServiceController.IRemoteService))) {
return ((com.example.RemoteServiceController.IRemoteService)iin);
}
return new com.example.RemoteServiceController.IRemoteService.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_sum:
{
data.enforceInterface(DESCRIPTOR);
int _arg0;
_arg0 = data.readInt();
int _arg1;
_arg1 = data.readInt();
int _result = this.sum(_arg0, _arg1);
reply.writeNoException();
reply.writeInt(_result);
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements com.example.RemoteServiceController.IRemoteService
{
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 sum(int a, int b) 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);
_data.writeInt(a);
_data.writeInt(b);
mRemote.transact(Stub.TRANSACTION_sum, _data, _reply, 0);
_reply.readException();
_result = _reply.readInt();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}
static final int TRANSACTION_sum = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
}
public int sum(int a, int b) throws android.os.RemoteException;
}

沒有留言:

張貼留言