Android-使用AIDL进程间通信

对于客户端和服务之间通信,虽然可以通过Ibinder实现,但需要共享业务实现,如果在进程间通信的haunted,需要使用AIDL(Android Interface Definition Language)进行。

AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,编译器生成代码,实现Android设备上的两个进程间通信(IPC),AIDL的IPC机制和EJB所采用的CORBA很类似,进程之间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后在转换成相应的对象。由于进程之间的通信信息需要双向转换,所以android采用代理类背后实现了信息的双向转换,代理类由android编译器生成,对开发人员来说是透明的。

使用方式如下:

1、 定义AIDL(同接口相似,但没有可见性,扩展名有.java—>.aidl)

//IdownloadService.aidl,注意扩展名

package cn.itcast.aidl;

interface IdownloadService{

void download(in/out/input String path);//in|out|inout是参数的方向。

}

Ide会自动在gen包下生成对应的java类,接口文件中生成一个stub的抽象类,里面包括aidl定义的方法,还包括一些其它辅助方法。值得关注的是asInterface(IBinder iBinder),它返回接口类型的实例,对于远程服务调用,远程服务返回给客户端的对象,客户端onServiceConnectionted(ComponentName name,IBinder service)方法引用该对象时不能直接强转成接口类型的实例,而应该使用asInterface(IBinder iBinder)进行类型转换。

编写AIDL需要注意:

1. 接口名和aidl文件相同。

2. 接口和方法前不用加访问权限修饰符public,private,protected等,也不能用final,static.

3. Aidl默认支持的类型包括java基本类型(int,long,boolean等)和(String,List,Map,CharSequence),使用这些类型是不需要import声明,对于List和Map中的元素类型必须是Aidl支持的类型,如果用自定义类型作为参数或返回值,自定义类型必须实现Parcelable接口。

4. 自定义类型的AIDL生成的其它接口类型在aidl描述文件中,应该显示import,即便在该类型和定义的包同一个包中。

5. 在aidl文件中所有非Java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数,输出参数还是输入输出参数。

6.Java原始类型默认的标记位in,不能为其它标记。

Javabean必须实现Parcelable接口

class Person implements Parcelable{

id,name;

public int describeContents(){

return 0;

}

//把javabean中的数据写到Parcel

public void writeToParcel(Parcel dest,int flags){

dest.writeInt(this.id);

dest.writeString(this.name);

}

//添加一个静态成员,名为CREATOR,该对象实现了Parcelable.Creator接口

public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){

public Person createFromParcel(Parcel source) { return new Person(source.readInt(), source.readString());

}

public Person[] newArray(int size) {

return new Person[size];

}};

}

在自定义类型包中定义aidl声明文件

//Person.aidl,注意Parcelable是小写

Package cn.itcast.domain;

parcelable Person;

interface cn.itcast.domain.Person;

interface IPersonService{

void save(in Person person);

}

创建aidl接口实现类(通过继承${业务接口}.stub类实现)

Public class ServiceBinder extends IPersonService.Stub{

Public void save(Person person) throws RemoteException{

Log.i(“PersonService”,person.getId()+”=”+person.getName());

}

}

实现service的onBind方法,返回值就是上一步创建的aidl实现类对象。

public IBinder onBind(Intent intent){

return new ServiceBinder();

}

客户端通过隐式意图访问服务。

<service android:name=”.PersonService”>

<intent-filter>

<action android:name=”cn.itcast.process.aidl.PersonService”/>

new Intent(“cn.itcast.process.aidl.PersonService”);

复制aidl文件和所在包到客户端对应的src下。(客户端会自动生成对应java类)

this.bindService(,this.sc,BIND_AUTO_CREATE);

sc = new ServiceConnection(){

public void onServiceConnected(ComponentName,IBinder service){

personService = IPersonService.Stub.asInterface(service);

personService.save(new Person(56,”liming”));

}

public void onServiceDisconnected(ComponetName name){

personService = null;

}

}

Android-结束通话

Android没有对外公开通话的API,如果需要结束通话,必须使用AIDL于电话管理服务进行通行,并调用服务中的API实现结束通话,方法如下:

1. 从Android的源代码中拷贝以下文件到项目中:

com/android/internal/telephony/ITelephony.aidl

android/telephony/NeighboringCellInfo.aidl

如右图所示。开发工具会在gen目录下自动生成ITelephony.java

2. 调用ITelephony.endCall()结束通话:

Method method = Class.forName(“android.os.ServiceManager”)

.getMethod(“getService”,String.class);

IBinder binder = (IBinder)method.invoke(null,new Object[]{TELEPHONY_SERVICE});

ITelephony telephony = ITelephony.Stub.asInterface(binder);

Telephony.endCall();

在清单文件AndroidManifest.xml中添加权限

<uses-permission android:name=”android.permission.CALL_PHONE”/

时间: 2024-08-01 09:36:28

Android-使用AIDL进程间通信的相关文章

基于Android AIDL进程间通信接口使用介绍_Android

AIDL:Android Interface Definition Language,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口. ICP:Interprocess Communication ,内部进程通信. 使用: 1.先创建一个aidl文件,aidl文件的定义和java代码类似,但是!它可以引用其它aidl文件中定义的接口和类,但是不能引用自定义的java类文件中定义的接口和类,要引用自定义的接口或类,需要为此类也定义一个对应的aidl文件,并且此

android中的AIDL进程间通信示例

关于IPC应该不用多介绍了,Android系统中的进程之间不能共享内存,那么如果两个不同的应用程序之间需要通讯怎么办呢?比如公司的一个项目要更新,产品的需求是依附于当前项目开发一个插件,但是呢这个插件功能以及界面比较复杂,不能和当前项目在一个进程中,同时呢,还要用到当前项目中已经写好了的一些东西,那么因为新开发的依附于当前项目的插件和当前项目不是一个进程,因此不能共享内存,就出现了问题,于是,需要提供一些机制在不同进程之间进行数据通信,这个机制就是AIDL了. 一.一个android中AIDL的

android-关于Android IDevicePolicyManager.aidl的问题

问题描述 关于Android IDevicePolicyManager.aidl的问题 看关于Android锁屏的代码看到最后是调用了IDevicePolicyManager.aidl里面的方法.比如getPasswordQuality().那IDevicePolicyManager.aidl这个文件最后又是怎么往下调用呢?该怎么追踪这种aidl文件的方法? 解决方案 AIDL需要一个服务程序和客户程序.如果有多个AIDL的服务程序和客户程序,那么服务程序名字不要一样,否则其他的客户程序访问时会

进程间通讯-Android开发 AIDL接口文件里使用内部类报错unknown type

问题描述 Android开发 AIDL接口文件里使用内部类报错unknown type 在Android开发时涉及到一个进程间通讯,要传递一个内部类对象到远程服务端.已经把内部类对象用Parcelable序列化了,但是编译总是报错unknown type 外部类.内部类. 1.AIDL能否传递内部类对象到远程端? 2.此问题该怎样解决?

Android AIDL进程间通信(IPC)

IPC是Inter-Process Communication的缩写,意思是进程间通信.Android中IPC的方式有很多种,今天先说最灵活也是最常用的一种,即AIDL(Android Interface Definition Language)方式. 创建多进程的方式有两种,一,给四大组件指定android:process属性,二,通过JNI在native层fork一个新的进程.今天Demo以第一种为例,因为第二种我不会.为了方便查看此Demo没有写两个工程,而是在同一个应用内给SecondA

基于Android AIDL进程间通信接口使用介绍

AIDL:Android Interface Definition Language,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口. ICP:Interprocess Communication ,内部进程通信. 使用: 1.先创建一个aidl文件,aidl文件的定义和java代码类似,但是!它可以引用其它aidl文件中定义的接口和类,但是不能引用自定义的java类文件中定义的接口和类,要引用自定义的接口或类,需要为此类也定义一个对应的aidl文件,并且此

android如何实现进程间通信

一.使用bundle 当我们在一个进程中启动了另一个进程的activity.service.receiver,我们就可以在bundle中附加我们需要传输给远程进程的信息并通过intent发送出去. 我们传输的数据要必须能被序列化. 以上原理都是bundle 当然service也是支持通过intent启动来传递数据的 这种方案是一种最最简单的进程间通信 二.使用文件共享 三.使用Messenger 1.简介 Messenger的底层是aidl 2.Aidl和messager的区别 原因是AIDL可

Android下AIDL机制详解

AIDL全名Android Interface Definition Language,是一种接口定义语言,也是Android系统的一种跨进程通信机制.从AIDL的名字就可以看出来,AIDL做的就是在服务提供进程和服务使用进程之间的协商好的接口,双方通过该接口进行通信.本文将以一个例子来讲述AIDL的使用方式和流程,在下一篇文章中我将从代码层面对AIDL进行分析. AIDL实例 文章中所涉及的例子来源于android开发之AIDL用法_进程间通信原理详解一文.首先我们创建一个AIDL文件,并创建

android开发-aidl 向远程服务注册listener问题

问题描述 aidl 向远程服务注册listener问题 在android开发中遇到一个aidl问题. 向远程服务注册监听器,但是报一个Bad magic number for Bundle错误 在普通用法是没有问题的,这个错误是因为我有个需求是在静态方法中调用 有没有人遇到过这样的问题? 解决方案 看看有没有帮助http://stackoverflow.com/questions/26202149/bad-magic-number-for-bundle-in-android 解决方案二: 关于s