概述:

AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来生成用于IPC的代码。从某种意义上说AIDL其实是一个模板,因为在使用过程中,实际起作用的并不是AIDL文件,而是据此而生成的一个Interface的实例代码,AIDL其实是为了避免我们重复编写代码而出现的一个模板。AIDL目的就是为了实现进程间通信。

AIDL基本语法:

1、AIDL文件以 .aidl 为后缀名

2、AIDL支持的数据类型分为如下几种:

  • 八种基本数据类型:byte、char、short、int、long、float、double、boolean

String,CharSequence

  • 实现了Parcelable接口的数据类型
  • List 类型。List承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象
  • Map类型。Map承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象

3、AIDL文件可以分为两类。一类用来声明实现了Parcelable接口的数据类型,以供其他AIDL文件使用那些非默认支持的数据类型。还有一类是用来定义接口方法,声明要暴露哪些接口给客户端调用,定向Tag就是用来标注这些方法的参数值

Android使用AIDL

1.步骤

(1)在Eclipse Android工程的Java包目录中建立一个扩展名为A.aidl的文件,并写下需要的接口。如果aidl文件的内容是正确的,ADT会在gen目录下自动生成一个A.Java接口文件。

(2)建立一个服务类(Service的子类)。并在创建的服务类中创建一个内部类,实现由aidl文件生成的Java接口。

(3)在服务类的onBind方法返回时,将实现aidl接口的内部类对象返回出去。

(4)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。

2、具体操作

(1)创建文件InterfaceService.aidl

package my.wyl;
interface InterfaceService{  //只有一个接口
    String getPrice();
}   

(2)创建服务类及实现内部类MyService.java

public class MyService extends Service {
    @Override  public IBinder onBind(Intent arg0) {  // 把内部类的对象返回给客户端使用  return new MyServiceImpl();  }  // 创建一个继承自InterfaceService.Stub的内部类  public class MyServiceImpl extends InterfaceService.Stub {  // 必须实现AIDL文件中的接口  public String getPrice() throws RemoteException {  return null;  }  }
} 

注意,在自定义的MyService中,onBind方法必须返回MyServiceImpl类的对象实例,否则客户端无法获得服务对象。

(3)在AndroidManifest.xml中配置MyService

<service android:name=".MyService" >  <intent-filter>  <action android:name="my.wyl.InterfaceService" />  </intent-filter>
</service>  

上面的" my.wyl.InterfaceService "是客户端用于访问AIDL服务的ID。

3:本地客户端的使用方法:

(1)   新建一个Android目录,并将刚才远程服务端自动生成的gen目录下面的InterfaceService.java文件连同包目录一起复制到客户端工程的src目录中。

(2)   调用AIDL服务要先绑定服务,然后才能获得服务对象。

public class AIDLClientActivity extends Activity { // 远程服务端的对象 InterfaceService interfaceService; private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { // 绑定成功,得到远程服务端的对象,目标完成!!! interfaceService = InterfaceService.Stub.asInterface(service); } public void onServiceDisconnected(ComponentName name) { // 解除绑定 interfaceService = null; } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 绑定远程服务端服务 Intent serviceIntent = new Intent("my.wyl.InterfaceService"); bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);Log.i(“TAG”, interfaceService.getPrice())}
} 

4.使用AIDL小结

服务端方面:将需要开放的接口抽象到aidl文件中,然后在自己的内部类中对接口进行实现,并在自己被绑定的时候把内部类对象返回给客户端。

客户端方面:当我们需要远程某个Service时,就像在绑定本地的Service一样去bindService,然后在绑定成功的回调函数中(也就是onServiceConnected方法)得到一个Ibinder对象(比如Service),这时调用InterfaceService.Stub.asInterface(service)这样的语句,就可以得到服务端开放的interface接口对象,此时客户端可以直接调用这个对象的方法,犹如直接调用远程的Service对象一般。

5.定向Tag

InOut 类型的表现形式是,服务端对数据的改变同时也同步到了客户端,因此可以说两者之间数据是双向流动的

In 类型的表现形式是:数据只能由客户端传向服务端,服务端对数据的修改不会影响到客户端

Out类型的表现形式是:数据只能由服务端传向客户端,即使客户端向方法接口传入了一个对象,该对象中的属性值也是为空的,即不包含任何数据,服务端获取到该对象后,对该对象的任何操作,就会同步到客户端这边

转载于:https://www.cnblogs.com/yanglanwan/p/11300388.html

Android之进程间通信AIDL相关推荐

  1. 【Android】Android Binder进程间通信AIDL示例与源码分析

    前言 众所周知,Android进程间通信采用的是Binder机制.Binder是Android系统独有的进程间通信方式,它是采用mmp函数将进程的用户空间与内核空间的一块内存区域进行映射,免去了一次数 ...

  2. Android开发之IPC进程间通信-AIDL介绍及实例解析

    一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用 ...

  3. Android 进程间通信——AIDL

    代码地址如下: http://www.demodashi.com/demo/12321.html 原文地址:http://blog.csdn.net/vnanyesheshou/article/det ...

  4. Android开发——进程间通信之AIDL(一)

    0.  前言 不论是Android还是其他操作系统,都会有自己的IPC机制,所谓IPC(Inter-Process Communication)即进程间通信.首先线程和进程是很不同的概念,线程是CPU ...

  5. 【Android】使用AIDL传递用户自定义类型数据--附完整示例代码

    AIDL对Java类型的支持 AIDL支持Java原始数据类型 AIDL支持String和CharSequence AIDL支持传递其他AIDL接口,但你引用的每个AIDL接口都需要一个import语 ...

  6. Android Studio使用AIDL技术进行SDK开发

    前面我们有介绍AIDL的基本用法: Android进程间通信--AIDL Android进程间通信--AIDL Binder连接池 现在我们来介绍利用AIDL来实现一个简陋的SDK,将获取用户信息的方 ...

  7. Android应用进程间通信之Messenger信使使用及源码浅析

    转载: http://blog.csdn.net/yanbober 1 背景 这个知识点是个low货,刚开始其实想在之前一篇文章<Android异步消息处理机制详解及源码分析>一文中作为一 ...

  8. Android:学习AIDL,这一篇文章就够了(下)

    前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...

  9. android 中的aidl

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

  10. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder ...

最新文章

  1. NetworkX玩一下 --update@2017.06.28
  2. 如何根据keras的fit后返回的history绘制loss acc曲线
  3. python菜鸟基础教程-Python3 面向对象
  4. SSH框架--Struts的故事
  5. 网维大师服务器不运行,网维大师客户机连不上的解决方法
  6. 良心之作----centos6.5下安装svn客户端报错
  7. Linux下的MySQL测试,Linux下MySQL命令(1)
  8. 课程 |《知识图谱》第一期
  9. 自学Java必看的知识点,猿们怎么看?
  10. golang cobra powershell补全脚本
  11. mysql数据与Hadoop之间导入导出之Sqoop实例
  12. 腾讯广告“虚拟IP”赛题突出重围,入选第七届“互联网+”双创大赛产业命题
  13. 关掉云存储后噪声 海康摄像头_万物互联 海量数据如何实现更好的存储和应用...
  14. 七种方法实现单例模式
  15. vue中 localStorage的使用方法(详解)
  16. WPS个人版安装VBA教程
  17. 计算机组成原理(白中英) 第四章 课后题答案
  18. 即时通讯 音视频 开发技术
  19. SPSS——描述性统计分析——列联表
  20. springboot微服务使用Feign远程调用失败

热门文章

  1. CentOS 通过yum来升级php到php5.6
  2. 对于初步搭建好的SSH框架进行简化(注解的使用)
  3. 我为什么想并且要学习Scala
  4. The host '192.168.174.130' is unreachable. the host may be down..............
  5. 【转】推荐:全面了解数据库设计中分类算法
  6. .NET企业级应用架构设计的技术选型
  7. C#编码应注意的事项
  8. js简单屏蔽鼠标右键实现方式
  9. C语言 #和##的用法
  10. sql 筛选唯一值_多列数据获取唯一值?你再肉眼筛选的时候,我已经下班了