Android 接口定义语言 (AIDL)

1.AIDL是什么

  AIDL(Android 接口定义语言)与您可能使用过的其他 IDL 类似。 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。

2.AIDL 用途

  与Binder,Messenger一样,实现绑定服务。

3.何时才有必要用AIDL

  • 只有允许不同应用的客户端用 IPC 方式访问服务,并且想要在服务中处理多线程时,才有必要使用 AIDL。
  • 如果您不需要执行跨越不同应用的并发 IPC,就应该通过实现一个 Binder 创建接口;
  • 如果您想执行 IPC,但根本不需要处理多线程,则使用 Messenger 类来实现接口。

4.AIDL 接口的调用是直接函数调用

5.AIDL 接口的实现必须是完全线程安全实现

6.oneway

  oneway 关键字用于修改远程调用的行为。使用该关键字时,远程调用不会阻塞;它只是发送事务数据并立即返回。接口的实现最终接收此调用时,是以正常远程调用形式将其作为来自 Binder 线程池的常规调用进行接收。 如果 oneway 用于本地调用,则不会有任何影响,调用仍是同步调用。

7.aidl 文件内的数据类型

  参数和返回值可以是任意类型,甚至可以是其他 AIDL 生成的接口。

  默认情况下,AIDL 支持下列数据类型:

  • 基本类型(如 intlongcharboolean 等等
  • String
  • CharSequence
  • List ,另一端实际接收的具体类始终是 ArrayList,但生成的方法使用的是 List 接口。注意,是始终
  • Map,另一端实际接收的具体类始终是 HashMap,但生成的方法使用的是 Map 接口。注意,是始终

  List和Map中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。

8.在aidl中定义服务接口的注意事项

  • 方法可带零个或多个参数,返回值或空值。
  • 所有非基本类型参数都需要指示数据走向的方向标记。可以是 inout 或 inout(见以下示例)
  • 原语默认为 in,不能是其他方向。
  • 所有代码注释都包含在生成的 IBinder 接口中(import 和 package 语句之前的注释除外)
  • 只支持方法;您不能公开 AIDL 中的静态字段。注意,是不能公开,没说不能定义。

9.实现 AIDL 接口时应注意遵守以下这几个规则

  • 由于不能保证在主线程上执行传入调用,因此您一开始就需要做好多线程处理准备,并将您的服务正确地编译为线程安全服务。
  • 默认情况下,RPC 调用是同步调用。如果您明知服务完成请求的时间不止几毫秒,就不应该从 Activity 的主线程调用服务,因为这样做可能会使应用挂起(Android 可能会显示“Application is Not Responding”对话框)— 您通常应该从客户端内的单独线程调用服务。
  • 您引发的任何异常都不会回传给调用方。

10.在aidl接口中的非基本类型是如何在进程间传递的?

  这是本文最重要一条

  通过 IPC 接口把某个类从一个进程发送到另一个进程是可以实现的。

  前提是必须确保该类的代码对 IPC 通道的两端都可用,并且该类必须支持Parcelable 接口。支持 Parcelable 接口很重要,因为 Android 系统可通过它将对象分解成可编组到各进程的原语。

11.如何创建支持 Parcelable 协议的类

  必须执行以下操作:

  • 让您的类实现 Parcelable 接口。
  • 实现 writeToParcel,它会获取对象的当前状态并将其写入 Parcel
  • 为您的类添加一个名为 CREATOR 的静态字段,这个字段是一个实现 Parcelable.Creator 接口的对象。
  • 最后,创建一个声明可打包类的 .aidl 文件(按照下文 Rect.aidl 文件所示步骤)。如下:
     package android.graphics;
    
     // Declare Rect so AIDL can find it and knows that it implements
    // the parcelable protocol.
    parcelable Rect;

  示例

 import android.os.Parcel;
import android.os.Parcelable; public final class Rect implements Parcelable {
public int left;
public int top;
public int right;
public int bottom; public static final Parcelable.Creator<Rect> CREATOR = new
  Parcelable.Creator<Rect>() {
public Rect createFromParcel(Parcel in) {
return new Rect(in);
} public Rect[] newArray(int size) {
return new Rect[size];
}
}; public Rect() {
} private Rect(Parcel in) {
readFromParcel(in);
} public void writeToParcel(Parcel out) {
out.writeInt(left);
out.writeInt(top);
out.writeInt(right);
out.writeInt(bottom);
} public void readFromParcel(Parcel in) {
left = in.readInt();
top = in.readInt();
right = in.readInt();
bottom = in.readInt();
}
}

  如果您使用的是自定义编译进程,切勿在您的编译中添加 .aidl 文件。 此 .aidl 文件与 C 语言中的头文件类似,并未编译。

  AIDL 在它生成的代码中使用这些方法和字段将您的对象序列化和反序列化。

12.有关调用 IPC 服务的几点说明

  • 对象是跨进程计数的引用。
  • 您可以将匿名对象作为方法参数发送。

AIDL(1):简介的更多相关文章

  1. 服务 进程间通讯 IPC AIDL Parcelable 简介

    1.IBinder和Binder是什么鬼? 我们来看看官方文档怎么说: 中文翻译:  IBinder是远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分. 但他不仅用于远程调用,也用 ...

  2. AIDL旅行记之开篇AIDL基本介绍

    嗨,伙伴们,计划了一周的想法最终要在这一刻实现了. 一直都想写一个博客专栏,但是总是鼓不起勇气来写.感觉自己的水量还不太够.哈哈.这次下定决心,与小伙伴们一起分享下Android中的AIDL,从此,也 ...

  3. 疯狂Android讲义 - 学习笔记(八)

    第10章 Service与BroadcastReceiver 10.1 Service简介 Service组件也是可执行的程序,有自己的生命周期,创建.配置Service与创建.配置Activity的 ...

  4. Android开发学习清单

    目录: 第1章 Android应用与开发环境1.1 Android的发展和历史1.1.1 Android的发展和简介1.1.2 Android平台架构及特性1.2 搭建Android开发环境1.2.1 ...

  5. android学习笔记57——Service_2

    Service生命周期 参考:http://codingnow.cn/android/515.html 应用程序启动服务的方式不同,其生命周期也有所不同. startService生命周期如下左图: ...

  6. android中的Serveice组件

    创建 配置 Service: 1.定义一个继承了Service类的子类 2.在 AndroidManifest.xml清单文件中对开发的Service进行配置 Service和Activity很相似, ...

  7. 【Android - IPC】之AIDL简介

    参考资料: 1.<Android开发艺术探索>第二章2.4.4 2.Android AIDL Binder框架解析:http://blog.csdn.net/lmj623565791/ar ...

  8. IntentService简介

    参照文章:http://android.tgbus.com/Android/tutorial/201106/355229.shtml IntentService是Service类的子类,用来处理异步请 ...

  9. Android的IPC机制(一)——AIDL的使用

    综述 IPC(interprocess communication)是指进程间通信,也就是在两个进程间进行数据交互.不同的操作系统都有他们自己的一套IPC机制.例如在Linux操作系统中可以通过管道. ...

随机推荐

  1. DRF 之 认证组件

    1.认证的作用? 我们知道,当我们在网站上登陆之后,就会有自己的个人中心,之类的可以对自己的信息进行修改.但是http请求又是无状态的,所以导致我们每次请求都是一个新的请求,服务端每次都需要对请求进行 ...

  2. 在centos7下手工安装和配置Nginx

    一.什么是Nginx Nginx("enginex")是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器,在高连接并发的情况下Nginx是Apa ...

  3. NEU 1681: The Singles

    题目描述 The Signals’ Day has passed for a few days. Numerous sales promotion campaigns on the shopping ...

  4. NOSQL安全攻击

    摘自:http://www.infoq.com/cn/articles/nosql-injections-analysis JSON查询以及数据格式 PHP编码数组为原生JSON.嗯,数组示例如下: ...

  5. POJ3020 二分图匹配——最小路径覆盖

    Description The Global Aerial Research Centre has been allotted the task of building the fifth gener ...

  6. you are the one(区间dp)

    传送门 You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. MyBatis相关资源

    MyBatis很多项目中有用到,但会用并不表示你真正理解它,更不代表你能很清楚的教会别人.如果想在会用它的基础上更深入的通过学习它而提升自己技术能力,可利用下面资源. 1.官网文档,基本概念讲的很清楚 ...

  8. codeforces round 421 div2 补题 CF 820 A-E

    A Mister B and Book Reading  O(n)暴力即可 #include<bits/stdc++.h> using namespace std; typedef lon ...

  9. Open multiple excel files in WebBrowser, only the last one gets activated

    http://stackoverflow.com/questions/20578053/open-multiple-excel-files-in-webbrowser-only-the-last-on ...

  10. Eclipse安装配置Maven

    Eclipse安装配置Maven 1 安装配置Maven 1.1 下载Maven 从Apache网站 http://maven.apache.org/ 下载并且解压缩安装Apache Maven.   ...