AIDL使用详解
一、对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使用详解的更多相关文章
- Android AIDL使用详解_Android IPC 机制详解
一.概述 AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来 ...
- Android进程间通信(一):AIDL使用详解
一.概述 AIDL是Android Interface Definition Language的缩写,即Android接口定义语言.它是Android的进程间通信比较常用的一种方式. Android中 ...
- Android AIDL使用详解
1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间 ...
- Android查缺补漏(IPC篇)-- 款进程通讯之AIDL详解
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- Android查缺补漏(IPC篇)-- 进程间通讯之AIDL详解
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- Android进阶笔记:AIDL内部实现详解 (二)
接着上一篇分析的aidl的流程解析.知道了aidl主要就是利用Ibinder来实现跨进程通信的.既然是通过对Binder各种方法的封装,那也可以不使用aidl自己通过Binder来实现跨进程通讯.那么 ...
- Android进阶笔记:AIDL内部实现详解 (一)
AIDL内部实现详解 (一) AIDL的作用是实现跨进程通讯使用方法也非常的简单,他的设计模式是典型的C/S架构.使用AIDL只要在Client端和Server端的项目根目录下面创建一个aidl的文件 ...
- Android-Service基本用法、AIDL、Binder连接池详解
本文介绍Service与Activity之间的通信,文章包含以下内容: 一.Service基本用法 二.通过AIDL实现Service与Activity跨进程通信 三.Binder连接池 四.使用Me ...
- 【转载】Android Studio Service AIDL 详解
公司产品之前IM这块存在很多问题,消息到达率低,加上协议上有些问题,丢消息频繁,所以需要重构IM,AIDL不能解决以上问题.好吧!那AIDL可以解决什么问题?什么是AIDL? 什么是AIDL? AID ...
随机推荐
- 让你提前认识软件开发(19):C语言中的协议及单元測试演示样例
第1部分 又一次认识C语言 C语言中的协议及单元測试演示样例 [文章摘要] 在实际的软件开发项目中.常常要实现多个模块之间的通信.这就须要大家约定好相互之间的通信协议,各自依照协议来收发和解析消息. ...
- python小游戏实现代码
早上逛CSDN首页就见到这么一篇教程.看了一下很有意思,就马上动手实现了一下.看看效果吧: 完整代码: # -*- coding: utf-8 -*- # 1 - Import library imp ...
- c 输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限 (MD花了半天时间,思路不对害死人)
输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限 比如: 输入: 输出: 输入: 输出: #include<stdio.h> int main(void) { ...
- MD5算法【计算文件和字符串的MD5值】
1. MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错).任何长度的任意内容都可以用MD5计算出散列值.MD5的前身:MD2.MD3.MD4.介绍工具:CalcMD5 ...
- ACE6.2.0文件/目录操作
文件读取.#include "ace/FILE_Connector.h"#include "ace/FILE_IO.h"void fileRW(){ACE_FI ...
- BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路( 最短路 )
从起点和终点各跑一次最短路 , 然后枚举每一条边 , 更新answer ---------------------------------------------------------------- ...
- BZOJ 2015: [Usaco2010 Feb]Chocolate Giving( 最短路 )
裸最短路.. ------------------------------------------------------------------------------------ #include ...
- 解析ASP.NET Mvc开发之删除修改数据
目录: 1)从明源动力到创新工场这一路走来 2)解析ASP.NET WebForm和Mvc开发的区别 3)解析ASP.NET Mvc开发之查询数据实例 4)解析ASP.NET Mvc开发之EF延迟加载 ...
- div+css 布局下兼容IE6 IE7 FF常见问题
div+css 布局下兼容IE6 IE7 FF常见问题 收藏 所有浏览器 通用 (市面上主要用到的IE6 IE7 FF)height: 100px; IE6 专用 _height: 100px; IE ...
- 在QuartusII 中使用tcl对工程进行复制——半自动
最近在看coyoo的博客,加上手上有一本coyoo老师的书籍.本人是脚本小白,怎么看都没有看懂这个自动化是怎么实现的. 先说我的半自动化,后面在说我对自动化的一点疑惑—— 目前没有实现 目录环境: 首 ...