对于客户端和服务之间通信,虽然可以通过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”/>

Android-使用AIDL进程间通信相关推荐

  1. android中的AIDL进程间通信

    关于IPC应该不用多介绍了,Android系统中的进程之间不能共享内存,那么如果两个不同的应用程序之间需要通讯怎么办呢?比如公司的一个项目要更新,产品的需求是依附于当前项目开发一个插件,但是呢这个插件 ...

  2. android aidl工具,【Android】AIDL介绍和实例讲解

    前言 为使应用程序之间能够彼此通信,Android提供了IPC (Inter Process Communication,进程间通信)的一种独特实现: AIDL (Android Interface ...

  3. Android中的进程间通信(IPC机制)

    记得上次阿里电话面试就问,Android中的进程间通信有哪些?当时没怎么总结过,就只说了一个AIDL.今天就来总结总结吧. 什么是进程间通信? 顾名思义,两个进程之间进行数据交换的过程,那什么又是进程 ...

  4. Android的AIDL以及挂断电话

    最新实战教程,让你了解Android自动化刷量.作弊与防作弊的那些事,案例:刷友盟统计.批量注册苹果帐号 Android的AIDL是什么呢,AIDL就是Android Interface Defina ...

  5. Aidl进程间通信详细介绍

    目录介绍 1.问题答疑 2.Aidl相关属性介绍 2.1 AIDL所支持的数据类型 2.2 服务端和客户端 2.3 AIDL的基本概念 3.实际开发中案例操作 3.1 aidl通信业务需求 3.2 操 ...

  6. android 使用AIDL实现进程间通讯

    一.创建服务端 1.首先创建AIDL文件 2.创建service,绑定AIDL接口 3.配置service <service android:name=".AidlService&qu ...

  7. android 自动生成aidl,[Android]用AIDL生成Service

    对于用aidl生成Service,之前作过,这里记录一下,顺便也整理一下思路.java 一.建立aidl文件.android 这个aidl文件必须包括包名,和用interface的形式定义方法.ecl ...

  8. Android进阶——AIDL详解之使用远程服务AIDL实现进程间带远程回调接口和自定义Bean的较复杂通信小结(二)

    文章大纲 引言 一.远程回调AIDL接口的应用 1.封装基本的父类和一些工具类 2. 创建服务端的AIDL 2.1.定义回调AIDL接口 2.2.定义业务AIDL接口 3.实现服务端对应AIDL的带有 ...

  9. Android 手写Binder 教你理解android中的进程间通信

    关于Binder,我就不解释的太多了,网上一搜资料一堆,但是估计还是很多人理解的有困难.今天就教你如何从 app层面来理解好Binder. 其实就从我们普通app开发者的角度来看,仅仅对于androi ...

最新文章

  1. 使用java连接JanusGraph进行操作,hbase报错信息为:Caused by: org.apache.hbase.thirdparty.io.netty.channel.AbstractCh
  2. 鸿蒙可以安装荣耀play,荣耀play3是鸿蒙系统吗
  3. git commit报错(husky > commit-msg hook failed)
  4. MySQL 连接报错:mysql access denied for user@ip
  5. 笔记四:onsubmit和onclick的区别
  6. 知其然就够了——大数据时代的思考之一
  7. PreaparedStatement中execut的使用
  8. [树形DP]贪吃的九头龙
  9. 网工笔记(三):IP Multicast组播技术
  10. VS2010 msdn 下载 安装
  11. 手撕promise.all以及promise.race
  12. Echarts 开源,免费商用图表控件使用整理
  13. 艺术能为你的生活做什么?
  14. 电子取证平台需求设计文档
  15. 初次使用github
  16. 学习笔记:深度学习(3)——卷积神经网络(CNN)理论篇
  17. (20)打鸡儿教你Vue.js
  18. org.aspectj.weaver.ResolvedType$Array cannot be cast to org.aspectj.weaver.ReferenceType
  19. 视频转换为swf格式
  20. Lab3因而起——对正则表达式的学习(二)

热门文章

  1. MySql连接查询与联合查询
  2. VTK:漫反射球用法实战
  3. VTK:绘制圆圈用法实战
  4. wxWidgets:wxVariantDataCurrency类用法
  5. wxWidgets:wxSystemOptions类用法
  6. boost::stable_sort相关的测试程序
  7. boost::log::sinks::text_ostream_backend用法的测试程序
  8. boost::graph模块实现DFS算法的测试程序
  9. Boost:宏BOOST_TEST_EQ的测试
  10. ITK:使用写访问权访问图像中的迭代区域