文章目录

  • 一、创建 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源文件 )相关推荐

  1. binder机制原理分析(一):ServiceManager 进程启动

    binder机制原理分析一共分5个部分,其实省了一点,但是分析到后面都差不多了,以后再补充吧. 1.ServiceManager 进程启动 2.普通Service注册到ServiceManager 3 ...

  2. JAVA编译成文件的说法_下列关于使用Javac命令编译后生成文件的说法中,正确的是?...

    下列关于使用Javac命令编译后生成文件的说法中,正确的是? 答:编译后生成的文件可以在Java虚拟机中运行\n\n编译后生成的文件为二进制文件\n\n编译后生成文件的后缀名为.class 线性表的链 ...

  3. keil uvisoin软件打开他人的工程文件上面出现黄色感叹号警告标志,后续编译不能生成.o文件而报错

    keil uvisoin软件打开他人的工程文件上面出现黄色感叹号警告标志,后续编译不能生成.o文件而报错 解决方案: 第一种:后续编译不能生成.o文件而报错 右键出现感叹号的文件 点击第一个" ...

  4. 编写python程序、创建名为class的数据库_Python中的元类(metaclass)以及元类实现单例模式...

    一.理解类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在P ...

  5. QT项目添加现有文件后不能运行,MFC在类视图中自动隐藏类

    解决方案:1)QT 5.6版本的QtCreator打开pro文件,在最后加一行空行或者删除一行空行,保存即可: 2)在隐藏的类对应的头文件中增加一行或删除一行(空格也可以),即可自动出现. 转载于:h ...

  6. c语言编译生成的目标文件拓展名,系统默认的C语言源程序文件的扩展名是(),经过编译后生成的目标文件的扩展名是(),经过连接后生成的可执行文件的扩展名是()。...

    系统序文常用的密钥分发技术有 CA 技术和[] 技术. 默认名名探究精神的重要性体现在以下哪些方面?() 如果采用偶校验,的目的可的扩0101010的校验位是(),0011011的校验位是(). 语言 ...

  7. 【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )

    文章目录 前言 一.分析 AIDL 文件生成的 Java 源文件 1.IMyAidlInterface.java 中的类结构 2.DESCRIPTOR 描述符 3.Stub 构造方法 4.Stub.a ...

  8. Android Binder机制情景源码分析之Binder回调注册和反注册

    我们在日常开发中,经常用到Binder来进行跨进程通信,有个比较常见的场景是向服务端注册Binder回调,比如: IActivityManager中有两个成对的方法,Client端向AMS所在的服务端 ...

  9. 【Binder 机制】Native 层 Binder 机制分析 ( service_manager.c | 开启 Binder | 注册 Binder 进程上下文 | 开启 Binder 循环 )

    文章目录 一.系统服务 二.系统服务主函数 三.开启 Binder 四.注册上下文 五.开启 Binder 循环 六.binder_write 方法 七.binder_ioctl 内核方法 八.bin ...

最新文章

  1. 2020年社招面试技巧总结!
  2. Eclipse MyEclipse下常用快捷键介绍
  3. 一致性hash算法简介
  4. 数据库分片教程mysql_简述MySQL分片中快速数据迁移
  5. bootstrap-switch 不起作用 class处显示代码_GTJ2018高频问题解答——第六弹:梁加腋箍筋显示、梁钢筋报表查看等问题...
  6. oracle恢复某个表的数据库,如何从rman的全备份中恢复一张表?
  7. pythonshell画图_Python3使用plotly模块保存图片与shell下生成表格
  8. 云服务器的操作系统是什么,服务器操作系统是什么?云服务器的操作系统怎么选择...
  9. 程序员如何跟领导提离职_员工辞职不交接工作被领导怒怼:我不批离职,跟你耗着,结果蒙了...
  10. 2019最后一个月Python继续霸榜,想上车?看这份书单
  11. 01-10 Linux-bash编程
  12. Android 常用adb shell 命令
  13. 清理tomcat缓存
  14. 字典写入excel_Excel中“先出式”出货的问题,以后出库太方便了
  15. MATLAB函数step()对单位负反馈系统求阶跃响应
  16. python爬虫之糗事百科
  17. lorawan 科普文
  18. matlab绘制平面等值线图
  19. 求助:MATLAB中实现卷积运算和理论分析中的卷积运算有什么区别?
  20. Android系统分区介绍

热门文章

  1. 夜深深~帮别人做课程设计。。。
  2. 服务器数据恢复难题--操作系统恢复的方法和思路
  3. 2019.03.21 增删改
  4. opencv7-ml之svm
  5. Linux下用arptables防arp攻击
  6. 使用ORACLE生成文本文件
  7. ADO.NET常用对象
  8. C#类中操作UI层控件状态[原]
  9. sqlserver 查询语句执行历史
  10. const char*, char const*, char*const 的区别