一、对AIDL进行说明

AIDL允许定义一个编程的接口来作为客户端和服务端通信的桥梁,AIDL定义了客户端和服务端的编程标准,在Android里边一个进程无法直接访问另一个进程的内存信息,但是要访问的话,我们就需要把他们的设备分解成操作系统能认识的基本数据类型。使用AIDL必须要跨进程,所以通讯起来非常耗内存和系统资源,因此,没有必要处处用AIDL,那么什么时候用AIDL呢,通过IPC机制不同的程序访问你的服务,并且服务要处理多线程的时候才有必要使用AIDL,如果你只是想通过IPC机制要不同的程序访问你的服务的时候,实现Binder就可以了;如果只想通过IPC机制,但是不想控制多线程,实现Messanger就可以了,Binder和Messanger都是在单线程中完成的。

二、实现AIDL步骤(AIDL里只可以定义方法,不可以定义属性)

      按照下边的步骤,细心地做下去,一定能学会AIDL的基本用法的

1、创建.aidl文件

下边是在eclipse里创建一个.aidl文件,创建完这个文件,就会在gen目录下自动生成一个相对应的.java文件,如图:

下边是在Android Studio里创建一个.aidl文件,为了让大家和下边的内容衔接起来,这个aidl文件要命名为IImoocAidl.aidl,里边的方法为 int add(num1,num2)。

但是使用AS不会自动编译,必须编译一下,才会生成.AIDL文件

编译前后的情况如下图:

2、写一个Service,在Servic里实现.aidl里的IImoocAidl接口,如下图:

3、共享一个接口给客户端,因为privite  IBinder  iBinder,所以不能直接访问iBinder,这个时候就要通过public  IBinder onBinder(Intent intent)这个方法,因为当客户端绑定在服务的时候就会调用这个方法。只需修改一下这个方法的返回值即可

以上是服务端的内容,下面是客户端的操作

客户端:新建一个项目,客户端简单的搭建一个界面:

1、在客户端需要创建一个和服务端一模一样的.aidl文件

2、绑定服务,绑定服务要写在onCreate方法里,当客户端启动的时候就绑定服务

3、2中缺一个conn,在这里要生成一个conn

privata  IlmcoocAidl  iImcoocAidl;

4、在相应的位置调用远程服务的方法,我这个里边是计算两个数的和

iImoocAidl.add(num1,num2);

5、解除绑定

三、AIDL支持的数据类型

1、基本数据类型(short不行)

2、string、CharSequence

3、List、Map

4、Parcelable

除了基本数据类型,其他类型的前面要加上in/out/inout来表示这个参数是输入、输出或者输入输出都能用的。

四、下边是支持Parcelable类型的一个例子

public class Person implements Parcelable{

private String name;

private int age;

public Person(String name, int age) {

super();

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public int describeContents() {

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeString(name);

dest.writeInt(age);

}

public Person(Parcel source) {

this.name=source.readString();

this.age=source.readInt();

}

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

@Override

public Person[] newArray(int size) {

return new Person[size];

}

@Override

public Person createFromParcel(Parcel source) {

return new Person(source);

}

};

}

需要创建两个.aidl文件,Person.aidl和IImoocAidl.aidl

创建一个IRmoteService

private  ArrayList<Person> persons;

以上是服务端的操作,下班是客户端的操作

1、拷贝服务端的两个aidl文件

2、绑定服务

3、生成一个conn

4、在相应的位置调用远程服务的方法

5、解除绑定

AIDL使用详解的更多相关文章

  1. Android AIDL使用详解_Android IPC 机制详解

    一.概述 AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来 ...

  2. Android进程间通信(一):AIDL使用详解

    一.概述 AIDL是Android Interface Definition Language的缩写,即Android接口定义语言.它是Android的进程间通信比较常用的一种方式. Android中 ...

  3. Android AIDL使用详解

    1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间 ...

  4. Android查缺补漏(IPC篇)-- 款进程通讯之AIDL详解

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

  5. Android查缺补漏(IPC篇)-- 进程间通讯之AIDL详解

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

  6. Android进阶笔记:AIDL内部实现详解 (二)

    接着上一篇分析的aidl的流程解析.知道了aidl主要就是利用Ibinder来实现跨进程通信的.既然是通过对Binder各种方法的封装,那也可以不使用aidl自己通过Binder来实现跨进程通讯.那么 ...

  7. Android进阶笔记:AIDL内部实现详解 (一)

    AIDL内部实现详解 (一) AIDL的作用是实现跨进程通讯使用方法也非常的简单,他的设计模式是典型的C/S架构.使用AIDL只要在Client端和Server端的项目根目录下面创建一个aidl的文件 ...

  8. Android-Service基本用法、AIDL、Binder连接池详解

    本文介绍Service与Activity之间的通信,文章包含以下内容: 一.Service基本用法 二.通过AIDL实现Service与Activity跨进程通信 三.Binder连接池 四.使用Me ...

  9. 【转载】Android Studio Service AIDL 详解

    公司产品之前IM这块存在很多问题,消息到达率低,加上协议上有些问题,丢消息频繁,所以需要重构IM,AIDL不能解决以上问题.好吧!那AIDL可以解决什么问题?什么是AIDL? 什么是AIDL? AID ...

随机推荐

  1. leetCode解题报告5道题(六)

    题目一: Longest Substring Without Repeating Characters Given a string, find the length of the longest s ...

  2. DevExpress ASP.NET 使用经验谈(9)-Dev控件客户端事件 ClientSideEvents

    上一节,已经介绍了ASPxGridView的自定义列和基本事件 ,本节接着将介绍Dev控件的客户端事件模型. 在上节示例基础上,我们增加一行菜单,使用Dev的ASPxMenu来实现,如下图所示. 图一 ...

  3. Enze frist day

    今天是我来到云和学院正式开班上课的第一天,我选择学习的科目是.net.因为.net我在学校的时候接触过一些,所以我想要更加深入的去学习.我觉得一个学生在学习上最怕的是没有遇到一位负责任的好老师,但幸运 ...

  4. dict和set的使用

    使用dict和set dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子 ...

  5. QT自定义对象导入JavaScript脚本使用

    1.对象 项目属性要添加 QT += script自定义的对象头文件如下,实现正常就好,记得脚本里要调用的方法一定要定义在public slots:下,要不然调用时提示该对象没有*方法   #ifnd ...

  6. 我的Python成长之路---第六天---Python基础(20)---2016年2月20日(晴)

    一.面向对象基础 面向对象名词解释: 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公 ...

  7. QT设置前景图位置(配色简单漂亮)

    QPushButton { background-image: url(:/Resources/green_click.png); image: url(:/Resources/toolsbutton ...

  8. [WPF疑难]Hide me! not close

    原文 [WPF疑难]Hide me! not close [WPF疑难]Hide me! not close                               周银辉 有朋友遇到这样的一个问 ...

  9. JRebel 6 破解版及使用方法

    最近更新到jrebel6.2.1了,我自己做了个技术分享的微信公众号(茶爸爸),有心的朋友可以来这里一起学习 云盘下载链接: http://pan.baidu.com/s/1bnGzMUF 配置: - ...

  10. IT第十八天 - 类的封装、继承、重载、上周总结★★★

    IT第十八天 上午 封装 1.关键字this,是表示该类在实例化时的对象,即this.表示为该对象的属性 2.类的数据保护,set.get方法的写法规则,为了之后的反射机制的读取数据,set方法中对于 ...