通过AIDL接口在进程间传递数据,记录在开发中遇到的一写问题 AIDL支持数据类型如下: 1. Java 的原生类型 2. String 和CharSequence 3. List 和 Map ,List和Map 对象的元素必须是AIDL支持的数据类型; 以上三种类型都不需要导入(import) 4. AIDL 自动生成的接
通过AIDL接口在进程间传递数据,记录在开发中遇到的一写问题 AIDL支持数据类型如下: 1. Java 的原生类型 2. String 和CharSequence 3. List 和 Map ,List和Map 对象的元素必须是AIDL支持的数据类型; 以上三种类型都不需要导入(import) 4. AIDL 自动生成的接口 需要导入(import) 5. 实现android.os.Parcelable 接口的类. 需要导入(import)。 问题1 在传递非基础数据时 在参数前需加修饰符
这里重点是in、out、inout修饰符以及Parcelable的使用!常见的是in、Parcelable,少用的out、inout。 这几种修饰符,可理解如下: in:客户端的参数输入; out:服务端的参数输入; inout:这个可以叫输入输出参数,客户端可输入、服务端也可输入。客户端输入了参数到服务端后,服务端也可对该参数进行修改等,最后在客户端上得到的是服务端输出的参数。 问题2 传递对象时的必要操作 1.必需实现Parcelable接口,内部类必需为静态内部类 2.需在aidl目录创建同类名的AIDL文件,并声明Parcelable,如图
AIDL文件代码就两行
问题3 参数大小的限制 如上在传递byte[] 长度大于1024*1024时会抛出 TransactionTooLargeException 异常 问题4 实现与服务之间互相调用 1.在绑定服务时会返回一个实现了AIDL的对象,这样可以通过对象调用服务中对应实现, 2.可以在应用层实现一个AIDL接口的对象,通过绑定服务返回的AIDL对象回传给服务,这样可以在服务中主动调用应用层的方法实现数据回传通知,
补充知识:在Android系统中实现AIDL功能 之前实现AIDL的功能都是通过eclipse或者android studio工具实现,最近由于项目需要,需要系统层提供接口给应用层使用,所以想到使用AIDL。下面已一个非常简单的Demo来说明在Android系统平台生成AIDL的jar供应用层使用。 一、AIDL的jar制作 首先新建一个android项目来用生产aidl的jar包,项目结构如下:
只有三个文件,首先看一下IVoiceClientInterface.aidl文件:
里面只有一个简单的方法face。 IVoiceClientInterface.aidl主要是服务器端来实现的,而VoiceManager.java是供客户端调用face方法使用的。VoiceManager.java具体实现如下:
Android.mk文件主要是用来将IVoiceClientInterface.aidl和VoiceManager.java编译成jar包,以方便在eclipse或者Android Studio中使用。
将该项目放置到android系统的packages/apps目录单编就可以生产out/target/common/obj/JAVA_LIBRARIES/SimpleJar_intermediates/classes.jar,classes.jar就可以导入eclipse或者Android Studio中使用。 二、服务端实现AIDL中的接口demo目录结构如下:
主要实现只有5个文件:SimpleService.java、Logger.java、BootReceiverBroadcast.java、 Android.mk、 AndroidManifest.xml。SimpleService.java是实现AIDL的服务,具体实现如下:
Logger.java是打印Log的简单封装,具体如下:
BootReceiverBroadcast.java是开机完成的时候拉起 SimpleService服务,具体实现如下:
Android.mk具体实现如下:
这里的simple.jar是第一步中制作的classes.jar。 AndroidManifest.xml配置文件如下:
到这里服务端就实现完了。 三、客户端实现AIDL的接口调用demo目录结构如下:
这里主要看5个文件:Logger.java、 test.xml、TestVoice.java、Android.mk、AndroidManifest.xml,其中Logger.java跟服务端代码一样的。TestVoice.java的实现也很简单,在button调用face方法,具体实现如下:
test.xml布局如下:
Android.mk实现如下:
AndroidManifest.xml实现如下:
到这里客户端也实现了。将服务端跟客户端的apk安装到系统就可以测试了。 测试结果打印如下:
|
2022-04-23
2022-01-26
2021-11-15
2021-08-02
2019-12-15