android 中aidl

来源:互联网 发布:哪个软件有汉仪丫丫体 编辑:程序博客网 时间:2024/04/30 19:57

客户端与服务端通信是通过Binder;

aidl 方便的定义了通信的格式;

通过aidl文件生成的的java文件

例如:

aidl文件:

// IRemoteSer.aidl package com.example.myapplication;  // Declare any non-default types here with import statements  interface IRemoteSer {     /**      * 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);    String test(int i, String m);      void play();  }

生成的java文件:

package com.example.myapplication;// Declare any non-default types here with import statementspublic interface IRemoteSer extends android.os.IInterface{/** Local-side IPC implementation stub class. */public static abstract class Stub extends android.os.Binder implements com.example.myapplication.IRemoteSer{private static final java.lang.String DESCRIPTOR = "com.example.myapplication.IRemoteSer";/** Construct the stub at attach it to the interface. */public Stub(){this.attachInterface(this, DESCRIPTOR);}/** * Cast an IBinder object into an com.example.myapplication.IRemoteSer interface, * generating a proxy if needed. */public static com.example.myapplication.IRemoteSer asInterface(android.os.IBinder obj){if ((obj==null)) {return null;}android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);if (((iin!=null)&&(iin instanceof com.example.myapplication.IRemoteSer))) {return ((com.example.myapplication.IRemoteSer)iin);}return new com.example.myapplication.IRemoteSer.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;}case TRANSACTION_test:{data.enforceInterface(DESCRIPTOR);int _arg0;_arg0 = data.readInt();java.lang.String _arg1;_arg1 = data.readString();java.lang.String _result = this.test(_arg0, _arg1);reply.writeNoException();reply.writeString(_result);return true;}case TRANSACTION_play:{data.enforceInterface(DESCRIPTOR);this.play();reply.writeNoException();return true;}}return super.onTransact(code, data, reply, flags);}private static class Proxy implements com.example.myapplication.IRemoteSer{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();}}@Override public java.lang.String test(int i, java.lang.String m) throws android.os.RemoteException{android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();java.lang.String _result;try {_data.writeInterfaceToken(DESCRIPTOR);_data.writeInt(i);_data.writeString(m);mRemote.transact(Stub.TRANSACTION_test, _data, _reply, 0);_reply.readException();_result = _reply.readString();}finally {_reply.recycle();_data.recycle();}return _result;}@Override public void play() throws android.os.RemoteException{android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();try {_data.writeInterfaceToken(DESCRIPTOR);mRemote.transact(Stub.TRANSACTION_play, _data, _reply, 0);_reply.readException();}finally {_reply.recycle();_data.recycle();}}}static final int TRANSACTION_basicTypes = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);static final int TRANSACTION_test = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);static final int TRANSACTION_play = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);}/**     * 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;public java.lang.String test(int i, java.lang.String m) throws android.os.RemoteException;public void play() throws android.os.RemoteException;}

内部抽象类Stub 对协议格式进行了实现; Stub.Proxy是客户端调用服务端方法的代理,通过transact方法实现;

服务端继承Stub实现IRemoteServce接口;    客户端拿到Binder ,   

new com.example.myapplication.IRemoteSer.Stub.Proxy(obj)

这个Binder是绑定到远程服务端的, 通过上面代理类进行数据传输;

下面是 messager的应用:

http://blog.csdn.net/lmj623565791/article/details/47017485;

messager跨进程使用handler;




0 0