Android AIDL传递自定义类型参数
- 格式:doc
- 大小:57.50 KB
- 文档页数:1
AIDL语法AIDL(Android Interface Definition Language)是一种用于在Android应用程序之间进行进程间通信(IPC)的语言。
它允许开发者定义客户端和服务端之间的接口,从而使它们能够在不同的进程中进行通信。
本文将详细介绍AIDL的语法及其使用。
1. AIDL介绍在Android应用程序中,进程间通信是常见的需求。
例如,一个应用程序可能需要与另一个应用程序共享数据或调用其功能。
AIDL提供了一种方便的方式来实现进程间通信,它允许开发者定义接口,并生成相应的Java代码,以便在不同的进程中进行通信。
AIDL支持的数据类型包括基本数据类型(如int、float等),字符串、List、Map等。
它还支持自定义数据类型,即开发者可以定义自己的Parcelable类,以便在不同的进程之间传递。
2. AIDL语法AIDL语法类似于Java语法,但有一些特殊的关键字和规则。
2.1 接口定义在AIDL中,接口由关键字interface定义。
接口中定义了可以在不同进程中调用的方法。
interface IMyInterface {void sayHello();int add(int a, int b);}在上述例子中,IMyInterface是一个AIDL接口,包含了两个方法:sayHello和add。
这些方法可以在不同的进程中调用。
2.2 数据类型AIDL支持多种数据类型,包括基本数据类型和自定义数据类型。
2.2.1 基本数据类型AIDL支持的基本数据类型包括int、long、float、double、boolean、char等。
interface IMyInterface {int add(int a, int b);float divide(float a, float b);}在上述例子中,add方法接受两个int类型的参数,并返回一个int类型的结果。
divide方法接受两个float类型的参数,并返回一个float类型的结果。
Android开发中的AIDL和跨进程通信技术在Android开发中,多进程通信是一个常见且重要的问题。
为了在不同进程间共享数据和资源,Android提供了一种称为AIDL (Android Interface Definition Language)的跨进程通信技术。
本文将介绍AIDL的概念、使用方法以及与跨进程通信相关的一些问题和注意事项。
一、AIDL简介AIDL是一种接口描述语言,它允许开发者定义一个接口,用于在不同进程间进行通信。
AIDL文件定义了接口的方法和参数,编译器会根据这个文件生成用于进程间通信的代码。
在AIDL中,方法的参数和返回值必须是Parcelable或基本数据类型,这样才能跨进程传递。
二、AIDL的使用方法1. 创建AIDL文件在Android Studio中创建一个新的AIDL文件,可以右键点击项目的包名,选择“New”->“AIDL”->“AIDL File”。
在AIDL文件中定义接口的方法和参数,例如:```interface IMyService {int add(int a, int b);```2. 实现AIDL接口创建一个服务类,实现刚才定义的AIDL接口。
重写接口中的方法,并在方法中处理具体的逻辑,例如:```public class MyService extends Service {private final binder = new () {@Overridepublic int add(int a, int b) {return a + b;}};@Nullable@Overridepublic IBinder onBind(Intent intent) {return binder;}```3. 调用AIDL接口在另一个应用程序中,通过绑定服务的方式来调用AIDL接口。
首先要获取到MyService所在应用程序的ComponentName,然后使用这个ComponentName来创建一个Intent对象,并调用bindService方法来绑定服务,例如:```ComponentName componentName = new ComponentName("", "");Intent intent = new Intent();(componentName);bindService(intent, connection, _AUTO_CREATE);```四、跨进程通信相关问题和注意事项1. 线程安全多进程通信涉及到不同进程间的数据共享,因此要格外注意线程安全。
大家好,好久不见,今天要给大家分享的是android aidl的使用。
在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦.AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。
它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.今天的两个实例用到两个Android工程,一个是AIDL的服务端另一个是客户端。
服务端的实现步骤:首先看一下服务端,工程目录如下:首先创建IaidlServerService.aidl文件,代码如下(一个简单方法,另一个返回对象方法),当我们点击保存时会在gen目录下生成对应的java文件,如上图红色部分:view plaincopy to clipboardprint?1package com.chapter8.aidl;2import com.chapter8.aidl.Book;3interface IAIDLServerService {45String sayHello();67Book getBook();8}第二步:因为这个接口里有传递对象,所以对象要特殊处理一下,这里继承了Parcelable,Book.java代码如下:如果大家不明的地方,请参见,下面连接的文章:view plaincopy to clipboardprint?9package com.chapter8.aidl;10import android.os.Parcel;11import android.os.Parcelable;12public class Book implements Parcelable {1314private String bookName;15private int bookPrice;1617public Book(){1819}2021public Book(Parcel parcel){22bookName = parcel.readString();23bookPrice = parcel.readInt();24}2526public String getBookName() {27return bookName;28}29public void setBookName(String bookName) {30this.bookName = bookName;31}32public int getBookPrice() {33return bookPrice;34}35public void setBookPrice(int bookPrice) {36this.bookPrice = bookPrice;37}3839public int describeContents() {40return 0;41}42public void writeToParcel(Parcel parcel, int flags) {43parcel.writeString(bookName);44parcel.writeInt(bookPrice);45}4647public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() { 48public Book createFromParcel(Parcel source) {4950return new Book(source);51}52public Book[] newArray(int size) {53return new Book[size];54}55};56}第三步:写一个与Book类对应的aidl,命名为Book.aidl,代码非常简单,代码如下:view plaincopy to clipboardprint?57parcelable Book;第四步:新建一个名为AidlServerService的Service.代码如下:view plaincopy to clipboardprint?58package com.chapter8.aidl;59import com.chapter8.aidl.IAIDLServerService.Stub;60import com.chapter8.aidl.IAIDLServerService;61import android.app.Service;62import android.content.Intent;63import android.os.IBinder;64import android.os.RemoteException;65public class AidlServerService extends Service {66@Override67public IBinder onBind(Intent intent) {68return mBinder;69}70/**71* 在AIDL文件中定义的接口实现。
Android中AIDL通信机制分析⼀、背景 ·1、AIDL出现的原因 在android系统中,每⼀个程序都是运⾏在⾃⼰的进程中,进程之间⽆法进⾏通讯,为了在Android平台,⼀个进程通常不能访问另⼀个进程的内存空间,所以要想对话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界。
通过代码来实现这个数据传输过程是冗长乏味的,Android提供了AIDL⼯具来处理这项⼯作,实现IPC(进⾏间的通信)与J2e中的RMI类似。
·2、绑定service 我看了很多⼈都博客都没有说到这⾥,其实我个⼈感觉AIDL就是⼀个远程的客户端⽽已,把之前BindService的中service的继承类单独拿出来放到远程客户端,在本地绑定service中我们⼀般是在onBind⽅法中将内部定义好的⼀个继承Binder类的对象返回给activity,在active ⾥⾯获得该对象然后去调⽤⽅法对于BindService的介绍见下⼀篇博客。
但是这⾥不⼀样我们是要去另⼀个进程说⽩点也就是另⼀个应⽤⾥⾯去获得数据,因此我们需要⼀些接⼝上的规则,来规范进程间的通信,让服务端应⽤进⾏发送,客户端应⽤来接受。
下⾯说⼀下规则是神马?⼆、AIDL服务端的步骤 ·1. 实现.aidl⽂件 以eclipse开发为例,我们需要在⼀般是在src⽂件夹下,新建⼀个包---⽂件夹,然后再该⽂件夹⽬录下新建⼀个⽂件该⽂件的后缀名以.aidl结尾,这是必须如此的。
·2. 在⽂件内部⾸先要给出包名, ·3. 在接⼝中⽤到的数据类型,除了基本类型,String,List,Map,CharSequence,之外其他的都需要导包,即使在同⼀个包内也是需要导包,因此⾥⾯的类,以及⽅法我们都是需要导包的。
·4. 安卓ADT⼀般会帮我们⾃动将写好的aidl⽂件编译⽣成⼀个java语法的接⼝类,这个借⼝在gen⽂件下,可以打开⾥⾯默认⽣成了⼀个内部抽象类stub该类继承Binder实现了起外部接⼝, ·5. 定义⽅法名称,所有的.aidl⽂件已经需要传递的对象接⼝需要在Service 与Client中各⼀份,最好是直接复制过去即可。
使用AIDL(Android接口描述语言)设计和使用远程接口文章分类:移动开发关键字: aidl、android 目录1 使用AIDL(AndRoid接口描述语言)设计和使用远程接口1.1 使用AIDL实现IPC1.1.1 创建一个AIDL文件1.1.2 实现接口1.1.3 向客户端公开接口1.1.4 使用parcelables进行参数的值传递1.2 调用一个IPC方法使用AIDL(AndRoid接口描述语言)设计和使用远程接口Since each application runs in its own process, and you can write a service that runs in a different process from your Application's UI, sometimes you need to pass objects between processes. On the Android platform, one process can not normally access the memory of another process. So to talk, they need to decompose their objects into primitives that the operating system can understand, and "marshall" the object across that boundary for you.通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI的方式写个运行在一个不同的进程中的 service。
在AndRoid平台中,一个进程通常不能访问其他进程中的内存区域。
所以,他们需要把对象拆分成操作系统能理解的简单形式,以便伪装成对象跨越边界访问。
详解Android中AIDL的使⽤AIDL,即Android Interface Definition Language,Android接⼝定义语⾔。
这门语⾔是为了实现进程间通信。
每⼀个进程都有⾃⼰的⼀块独⽴的内存,都在⾃⼰的内存上存储⾃⼰的数据,执⾏⾃⼰的操作,每个进程之间你不知我,我不知你,⽽AIDL,就是两个进程之间沟通的桥梁。
AIDL⽤来做什么AIDL是Android中IPC(Inter-Process Communication)⽅式中的⼀种,AIDL是Android Interface definition language的缩写,对于⼩⽩来说,AIDL的作⽤是让你可以在⾃⼰的APP⾥绑定⼀个其他APP的service,这样你的APP可以和其他APP交互。
aidl⽂件⽀持的数据类型包括:⼋种基本数据类型:byte、char、short、int、long、float、double、booleanString、CharSequence实现了Parcelable接⼝的数据类型List类型。
List承载的数据必须是AIDL⽀持的类型,或者是其他声明的AIDL对象Map类型。
Map承载的数据必须是AIDL⽀持的类型,或者是其他声明的AIDL对象在使⽤其他声明的AIDL对象的时候必须要导包,即使要使⽤的AIDL对象⽂件和当前正在编辑的aidl⽂件在同⼀个⽂件夹下。
aidl⽂件可以分为两类,⼀类⽤来声明实现了Parcelable接⼝的数据类型,以供其他AIDL⽂件使⽤那些⾮默认⽀持的数据类型。
还有⼀类是⽤来定义接⼝⽅法,声明要暴露哪些接⼝给客户端调⽤。
AIDL的具体使⽤步骤是:⼀、创建⼀个服务端⼯程1、如果aidl⽂件中涉及到实现了Parcelable接⼝的数据类型,则先将该aidl⽂件定义出来。
在src⽂件夹下右键,选择新建aidl ⽂件,这⾥新建了⼀个Book.aidl⽂件。
新建完以后,会在main⽂件下⽣成⼀个aidl的⽂件夹,aidl⽂件夹下的⽬录结构和java⽂件夹下的⽬录结构⼀样。
Android进程间通信(⼀):AIDL使⽤详解⼀、概述AIDL是Android Interface Definition Language的缩写,即Android接⼝定义语⾔。
它是Android的进程间通信⽐较常⽤的⼀种⽅式。
Android中,每⼀个进程都有⾃⼰的Dalvik VM实例,拥有⾃⼰的独⽴的内存空间,进程与进程之间不共享内存,这就产⽣了进程间通信的需求。
⼆、语法AIDL是Android接⼝定义语⾔,是⼀门语⾔,所以它拥有⾃⼰的语法和特性。
(⼀)数据类型AIDL⽀持的数据类型包括以下⼏种:1. Java的8种基本数据类型:int,short,long,char,double,byte,float,boolean;2. CharSequence类型,如String、SpannableString等;3. ArrayList,并且T必须是AIDL所⽀持的数据类型;4. HashMap<K,V>,并且K和V必须是AIDL所⽀持的数据类型;5. 所有Parceable接⼝的实现类,因为跨进程传输对象时,本质上是序列化与反序列化的过程;6. AIDL接⼝,所有的AIDL接⼝本⾝也可以作为可⽀持的数据类型;有两个需要注意的地⽅:1、在Java中,如果⼀个对象和引⽤它的类在同⼀个package下,是不需要导包的,即不需要import,⽽在AIDL中,⾃定义的Parceable对象和AIDL接⼝定义的对象必须在所引⽤的AIDL⽂件中显式import进来,不管这些对象和所引⽤它们的AIDL⽂件是否在同⼀个包下。
2、如果AIDL⽂件中使⽤到⾃定义的Parceable对象,则必须再创建⼀个与Parceable对象同名的AIDL⽂件,声明该对象为Parceable类型,并且根据上⼀条语法规定,在AIDL⽂件中进⾏显式import。
(⼆)⽂件类型1. 所有AIDL⽂件都是以.aidl作为后缀的;2. 根据⽤途区分,AIDL⽂件的有两种,⼀种是⽤于定义接⼝,另⼀种是⽤于声明parceable对象,以供其他AIDL⽂件使⽤;(三)定向tagAIDL中,除了基本数据类型,其他类型的⽅法参数都必须标上数据在跨进程通信中的流向:in、out或inout:1、in表⽰输⼊型参数:只能由客户端流向服务端,服务端收到该参数对象的完整数据,但服务端对该对象的后续修改不会影响到客户端传⼊的参数对象;2、out表⽰输出型参数:只能由服务端流向客户端,服务端收到该参数的空对象,服务端对该对象的后续修改将同步改动到客户端的相应参数对象;3、inout表⽰输⼊输出型参数:可在客户端与服务端双向流动,服务端接收到该参数对象的完整数据,且服务端对该对象的后续修改将同步改动到客户端的相应参数对象;定向tag需要⼀定的开销,根据实际需要去确定选择什么tag,不能滥⽤。
Android Interface Definition Language (AIDL)Android Interface Definition Language (AIDL)IN THIS DOCUMENTDefining an AIDL InterfaceCreate the .aidl fileImplement the interfaceExpose the interface to clientsPassing Objects over IPCCalling an IPC MethodSEE ALSOBound ServicesAIDL (Android Interface Definition Language) 与其他的接口定义语言相似。
定义这个接口,client 和service 可以通过这个接口在进程之间进行通信。
所以说,对象要能在进程之间传递,就需要将对象分解成系统能识别的指令。
通过代码实现那个是非常的冗长乏味的,android 系统通过AIDL可以处理。
Note: 希望从不同的应用中访问service,并且在service需要处理多线程,这种情况下才会使用AIDL。
如果不需要从其他的应用中处理IPC,那么可以实现Binder;如果需要IPC,但是不需要处理多线程,那么可以使用Messenger。
在使用之前,先考虑好哪种方式是适合自己的。
设计AIDL接口之前,需要确认AIDL接口里面该有的方法。
不能假设当调用发生时,thread会伴随。
发生什么是不同的,取决于该调用是从本地进程或远程进程的线程发起的。
具体来讲:在本地进程中的同一个线程发起调用请求。
如果这是你的主UI线程,线程继续在AIDL接口上执行。
如果是其他的线程,它会在service中运行代码。
如果仅仅是本地线程访问service,可以控制具体的线程在service中执行(如果是在这种情况下,不需要使用AIDL,可以用Binder方式代替).从远程进程的线程池中发起调用。
重庆达渝仁科技官网:
Aidl默认支持的类型包话java基本类型(int、long、boolean等)和(String、List、Map、CharSequence),如果要传递自定义类型,首先要让自定义类型支持parcelable协议,实现步骤如下:
1>自定义类型必须实现Parcelable接口,并且实现Parcelable接口的public void writeToParcel(Parcel dest, int flags)方法。
2>自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Creator接口及其方法。
3> 创建一个aidl文件声明你的自定义类型。
Parcelable接口的作用:实现了Parcelable接口的实例可以将自身的状态信息(状态信息通常指的是各成员变量的值)写入Parcel,也可以从Parcel中恢复其状态。
Parcel用来完成数据的序列化传递。
首先,自定义一个类
[java]view plaincopy
1.public interface Callback extends Parcelable {
2./*
3.* 返回信息
4.*/
5.public void SetMessage(String res);
6.
7.public static final Parcelable.Creator<Callback> CREATOR = new
Parcelable.Creator<Callback>() {
8.
9.@Override
10.public Callback[] newArray(int size) {
11.return new Callback[size];
12.}
13.
14.@Override
15.public Callback createFromParcel(Parcel source) {
16.// TODO Auto-generated method stub
17.return null;
18.}
19.};
20.}
其次,在自定义类型所在包下创建一个aidl文件对自定义类型进行声明,文件的名称与自定义类型同名。
package com.***;
parcelable Callback;
再次,在要接口的aidl中注明
void getMessage(String mum,in Callback obj);。