Android之进程间通信AIDL
概述:
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相关推荐
- 【Android】Android Binder进程间通信AIDL示例与源码分析
前言 众所周知,Android进程间通信采用的是Binder机制.Binder是Android系统独有的进程间通信方式,它是采用mmp函数将进程的用户空间与内核空间的一块内存区域进行映射,免去了一次数 ...
- Android开发之IPC进程间通信-AIDL介绍及实例解析
一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用 ...
- Android 进程间通信——AIDL
代码地址如下: http://www.demodashi.com/demo/12321.html 原文地址:http://blog.csdn.net/vnanyesheshou/article/det ...
- Android开发——进程间通信之AIDL(一)
0. 前言 不论是Android还是其他操作系统,都会有自己的IPC机制,所谓IPC(Inter-Process Communication)即进程间通信.首先线程和进程是很不同的概念,线程是CPU ...
- 【Android】使用AIDL传递用户自定义类型数据--附完整示例代码
AIDL对Java类型的支持 AIDL支持Java原始数据类型 AIDL支持String和CharSequence AIDL支持传递其他AIDL接口,但你引用的每个AIDL接口都需要一个import语 ...
- Android Studio使用AIDL技术进行SDK开发
前面我们有介绍AIDL的基本用法: Android进程间通信--AIDL Android进程间通信--AIDL Binder连接池 现在我们来介绍利用AIDL来实现一个简陋的SDK,将获取用户信息的方 ...
- Android应用进程间通信之Messenger信使使用及源码浅析
转载: http://blog.csdn.net/yanbober 1 背景 这个知识点是个low货,刚开始其实想在之前一篇文章<Android异步消息处理机制详解及源码分析>一文中作为一 ...
- Android:学习AIDL,这一篇文章就够了(下)
前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...
- android 中的aidl
1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间 ...
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
原文地址: http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder ...
最新文章
- NetworkX玩一下 --update@2017.06.28
- 如何根据keras的fit后返回的history绘制loss acc曲线
- python菜鸟基础教程-Python3 面向对象
- SSH框架--Struts的故事
- 网维大师服务器不运行,网维大师客户机连不上的解决方法
- 良心之作----centos6.5下安装svn客户端报错
- Linux下的MySQL测试,Linux下MySQL命令(1)
- 课程 |《知识图谱》第一期
- 自学Java必看的知识点,猿们怎么看?
- golang cobra powershell补全脚本
- mysql数据与Hadoop之间导入导出之Sqoop实例
- 腾讯广告“虚拟IP”赛题突出重围,入选第七届“互联网+”双创大赛产业命题
- 关掉云存储后噪声 海康摄像头_万物互联 海量数据如何实现更好的存储和应用...
- 七种方法实现单例模式
- vue中 localStorage的使用方法(详解)
- WPS个人版安装VBA教程
- 计算机组成原理(白中英) 第四章 课后题答案
- 即时通讯 音视频 开发技术
- SPSS——描述性统计分析——列联表
- springboot微服务使用Feign远程调用失败
热门文章
- CentOS 通过yum来升级php到php5.6
- 对于初步搭建好的SSH框架进行简化(注解的使用)
- 我为什么想并且要学习Scala
- The host '192.168.174.130' is unreachable. the host may be down..............
- 【转】推荐:全面了解数据库设计中分类算法
- .NET企业级应用架构设计的技术选型
- C#编码应注意的事项
- js简单屏蔽鼠标右键实现方式
- C语言 #和##的用法
- sql 筛选唯一值_多列数据获取唯一值?你再肉眼筛选的时候,我已经下班了