【Binder 机制】AIDL 分析 ( 创建 AIDL 文件 | 创建 Parcelable 类 | AIDL 中使用 Parcelable 类 | 编译工程生成 AIDL 对应的Java源文件 )
文章目錄
- 一、創建 AIDL 文件
- 1、創建 AIDL 目錄
- 2、創建 AIDL 文件
- 3、創建 Parcelable 類
- 4、AIDL 目錄下聲明 Parcelable 類
- 5、AIDL 中使用 Parcelable 類
- 二、編譯工程生成 AIDL 文件對應的 Java 源文件
- 1、編譯工程
- 2、生成的 AIDL 對應 Java 源文件
一、創建 AIDL 文件
1、創建 AIDL 目錄
在 Android Studio 工程中 , 創建 aidl 文件 ;
右鍵點擊 main 目錄 , 選擇 " New / Directory " ,
選擇創建 " aidl " 目錄 ,
創建好的 aidl 目錄如下 :
2、創建 AIDL 文件
右鍵點擊 " aidl " 目錄 , 選擇 " New / AIDL / AIDL File " 文件 ;
彈出對話框 , 輸入 AIDL 接口名稱 , 輸入完畢后 , 選擇 " Finish " 選項 ;
3、創建 Parcelable 類
創建 Parcelable 類 :
package kim.hsl.aidl_demo;import android.os.Parcel; import android.os.Parcelable;public class Student implements Parcelable {private String name;public Student(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}protected Student(Parcel in) {name = in.readString();}public static final Creator<Student> CREATOR = new Creator<Student>() {@Overridepublic Student createFromParcel(Parcel in) {return new Student(in);}@Overridepublic Student[] newArray(int size) {return new Student[size];}};@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);}public void readFromParcel(Parcel desc) {name = desc.readString();}@Overridepublic String toString() {return "name=" + name;} }4、AIDL 目錄下聲明 Parcelable 類
在 aidl 目錄下聲明 Parcelable 類 : 在 aidl 目錄下創建 Student.aidl 文件 , 然后聲明如下內容 ;
package kim.hsl.aidl_demo;parcelable Student;5、AIDL 中使用 Parcelable 類
在創建的 AIDL 接口中使用 Student 類 :
① 首先要導入 Student 類 , import kim.hsl.aidl_demo.Student;
② 參數的輸入輸出 , in 寫入, out 輸出, inout 寫入和輸出 ;
// IMyAidlInterface.aidl package kim.hsl.aidl_demo;import kim.hsl.aidl_demo.Student;// Declare any non-default types here with import statementsinterface 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);/*** in 寫入, out 輸出, inout 寫入和輸出*/void addStudent(inout Student student);/*** 獲取 Student 集合*/List<Student> getStudents(); }二、編譯工程生成 AIDL 文件對應的 Java 源文件
1、編譯工程
點擊 " 菜單欄 / Build / Make Project " 選項 , 即可編譯當前的工程 , 進而生成 AIDL 接口對應的 Java 源文件 ;
編譯后 , 在 " AIDL_Demo\app\build\generated\aidl_source_output_dir\debug\out\kim\hsl\aidl_demo " 目錄 , 生成了 AIDL 文件對應的源碼 :
2、生成的 AIDL 對應 Java 源文件
下面的源碼是編譯生成的 Java 源文件 :
/** This file is auto-generated. DO NOT MODIFY.*/ package kim.hsl.aidl_demo; // Declare any non-default types here with import statementspublic interface IMyAidlInterface extends android.os.IInterface {/** Default implementation for IMyAidlInterface. */public static class Default implements kim.hsl.aidl_demo.IMyAidlInterface{/*** 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{}/*** in 寫入, out 輸出, inout 寫入和輸出*/@Override public void addStudent(kim.hsl.aidl_demo.Student student) throws android.os.RemoteException{}/*** 獲取 Student 集合*/@Override public java.util.List<kim.hsl.aidl_demo.Student> getStudents() throws android.os.RemoteException{return null;}@Overridepublic android.os.IBinder asBinder() {return null;}}/** Local-side IPC implementation stub class. */public static abstract class Stub extends android.os.Binder implements kim.hsl.aidl_demo.IMyAidlInterface{private static final java.lang.String DESCRIPTOR = "kim.hsl.aidl_demo.IMyAidlInterface";/** Construct the stub at attach it to the interface. */public Stub(){this.attachInterface(this, DESCRIPTOR);}/*** Cast an IBinder object into an kim.hsl.aidl_demo.IMyAidlInterface interface,* generating a proxy if needed.*/public static kim.hsl.aidl_demo.IMyAidlInterface asInterface(android.os.IBinder obj){if ((obj==null)) {return null;}android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);if (((iin!=null)&&(iin instanceof kim.hsl.aidl_demo.IMyAidlInterface))) {return ((kim.hsl.aidl_demo.IMyAidlInterface)iin);}return new kim.hsl.aidl_demo.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{java.lang.String descriptor = DESCRIPTOR;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_addStudent:{data.enforceInterface(descriptor);kim.hsl.aidl_demo.Student _arg0;if ((0!=data.readInt())) {_arg0 = kim.hsl.aidl_demo.Student.CREATOR.createFromParcel(data);}else {_arg0 = null;}this.addStudent(_arg0);reply.writeNoException();if ((_arg0!=null)) {reply.writeInt(1);_arg0.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);}else {reply.writeInt(0);}return true;}case TRANSACTION_getStudents:{data.enforceInterface(descriptor);java.util.List<kim.hsl.aidl_demo.Student> _result = this.getStudents();reply.writeNoException();reply.writeTypedList(_result);return true;}default:{return super.onTransact(code, data, reply, flags);}}}private static class Proxy implements kim.hsl.aidl_demo.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);boolean _status = mRemote.transact(Stub.TRANSACTION_basicTypes, _data, _reply, 0);if (!_status && getDefaultImpl() != null) {getDefaultImpl().basicTypes(anInt, aLong, aBoolean, aFloat, aDouble, aString);return;}_reply.readException();}finally {_reply.recycle();_data.recycle();}}/*** in 寫入, out 輸出, inout 寫入和輸出*/@Override public void addStudent(kim.hsl.aidl_demo.Student student) throws android.os.RemoteException{android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();try {_data.writeInterfaceToken(DESCRIPTOR);if ((student!=null)) {_data.writeInt(1);student.writeToParcel(_data, 0);}else {_data.writeInt(0);}boolean _status = mRemote.transact(Stub.TRANSACTION_addStudent, _data, _reply, 0);if (!_status && getDefaultImpl() != null) {getDefaultImpl().addStudent(student);return;}_reply.readException();if ((0!=_reply.readInt())) {student.readFromParcel(_reply);}}finally {_reply.recycle();_data.recycle();}}/*** 獲取 Student 集合*/@Override public java.util.List<kim.hsl.aidl_demo.Student> getStudents() throws android.os.RemoteException{android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();java.util.List<kim.hsl.aidl_demo.Student> _result;try {_data.writeInterfaceToken(DESCRIPTOR);boolean _status = mRemote.transact(Stub.TRANSACTION_getStudents, _data, _reply, 0);if (!_status && getDefaultImpl() != null) {return getDefaultImpl().getStudents();}_reply.readException();_result = _reply.createTypedArrayList(kim.hsl.aidl_demo.Student.CREATOR);}finally {_reply.recycle();_data.recycle();}return _result;}public static kim.hsl.aidl_demo.IMyAidlInterface sDefaultImpl;}static final int TRANSACTION_basicTypes = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);static final int TRANSACTION_addStudent = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);static final int TRANSACTION_getStudents = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);public static boolean setDefaultImpl(kim.hsl.aidl_demo.IMyAidlInterface impl) {// Only one user of this interface can use this function// at a time. This is a heuristic to detect if two different// users in the same process use this function.if (Stub.Proxy.sDefaultImpl != null) {throw new IllegalStateException("setDefaultImpl() called twice");}if (impl != null) {Stub.Proxy.sDefaultImpl = impl;return true;}return false;}public static kim.hsl.aidl_demo.IMyAidlInterface getDefaultImpl() {return Stub.Proxy.sDefaultImpl;}}/*** 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;/*** in 寫入, out 輸出, inout 寫入和輸出*/public void addStudent(kim.hsl.aidl_demo.Student student) throws android.os.RemoteException;/*** 獲取 Student 集合*/public java.util.List<kim.hsl.aidl_demo.Student> getStudents() throws android.os.RemoteException; }總結
以上是生活随笔為你收集整理的【Binder 机制】AIDL 分析 ( 创建 AIDL 文件 | 创建 Parcelable 类 | AIDL 中使用 Parcelable 类 | 编译工程生成 AIDL 对应的Java源文件 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Binder 机制】进程通信 | 用户
- 下一篇: 【Binder 机制】AIDL 分析 (