AIDL学习

AIDL学习前知识

  AIDL:Android Interface Definition Language,即Android接口定义语言

  AIDL使用情景:Android中不同的进程之间不能直接通信,相互调用接口,实现数据的共享。此时,便能用AIDL来实现这中需求。

  Android使用Binder来实现进程间通信,Binder有点像一架桥梁,链接两个不同的进程:

  

  Binder能够携带processA的请求信息,告知processB需要调用processB的哪个接口,并返回processA所需要的接口引用。这个过程就像是本地请求服务器的数据操作一样,因此一般称processA为客户端,processB为服务端。

  AIDL做的工作就是给开发者提供一种固定的请求服务的代码格式,是一种写法,具体如何调用processB中的接口隐藏在简单格式的后面,由Android这一整套Binder机制来完成,无需开发者去操心,当然Binder机制还是可以学习的,这里不细说。

AIDL具体用法

  现在我们来尝试用AIDL来实现不同包之间的进程通信。

  1、由图我们可以看到,服务端我们写了一个AidlService的包,客户端我们新建了一个Test用来测试,我们需要在Test中调用AidlService中的MyService中的service,目标就是里面的count数据;

  

  

  2、首先我们需要把AidlService中的MyService的count通过一种方法包装出去,让所有的进程都能够调用。具体做法是新建一个AIDL文件,如上图所示,注意文件的后缀名是aidl:IMyService.aidl

  AIDL文件的写法很简单:

  

  里面申明了一个接口,接口是要拿到count数据。

  此时系统会自动在gen根目录下生成已个java文件:IMyService.java,这个正是AIDL有意思的地方,通过简单的AIDL文件申明,Binder机制中重要的调用关系不需要自己写,因为这是一套广泛使用的机制,所有Google把这个抽象出来了,便于开发者实现进程间调用,当然实现这个也可以完全自己去写接口代码,只是会降低代码耦合度。

  我们看看IMyService.java是怎么生成的:

  

  我们可以看到除了getCount()方法,还多了一个stub的抽象类,这个类正是申请Binder用的,继承了Binder类,绝大多数地方都没有修改。我们可以通过stub类,来创建Binder对象,借由这个对象来实现进程间通信。

  3、做完这个操作后,我们就可以在MyService中申明IMyService对象,获取Binder对象,实现getCount()方法。注意到Service自带的onBind方法,就是这个方法能够给客户端绑定service。

  

  4、到此服务端已经搭建完成,再来看客户端的调用规则。

  客户端需要和服务端一样,新建一个AIDL文件,和服务端一模一样,注意包名也需要一样,如此也会自动生成一个IMyService.java,且和AidlService中的一样。调用的时候,拿到ServiceConnection的一个对象,在onServiceConnectioned()中通过IMyService拿到接口实例,用这个connection设置intent,绑定service即可,

  

  之后便可以用intent直接调用AidlService中MyService中的getCount()方法了,注意的是远程调用需要加一个try-catch来防止远程调用exception。

  

时间: 2025-01-08 18:46:18

AIDL学习的相关文章

RemoteService与AIDL学习总结

最近公司内部组织的一个ANdroid四大组件的培训,由于自己是菜鸟,考试时被老师的一个问题忽悠住了,甚是丢人,估计过两天会被人事总监请喝茶.问题是Remote Service的生命周期是什么,我这一抬眼啊,就直接哆嗦了,什么?Remote是什么东东,RemoteService又是什么东东,其实大概知道就是那个什么AIDL的破玩意儿,之前还写过Demo,准确的说是copy别人的Demo,唉唉...所以说还是要自己动手翘翘才能容易理解啊,在大庭广众之下回答不上来,那是相当的没面子啊.事后想想这真是个

Android -- Service绑定解绑和aidl

Service是安卓四大组件之一,先前讲到了Service的生命周期,以及非绑定类型的生命周期的例子,这次来分享一下绑定形式的. 应用组件(客户端)可以调用bindService()绑定到一个service.Android系统之后调用service的onBind()方法,它返回一个用来与service交互的IBinder. 绑定是异步的,bindService()会立即返回,它不会返回IBinder给客户端.要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给b

如何自学Android

如何自学Android 欢迎转载,转载请注明原地址:http://blog.csdn.net/lavor_zl/article/details/51217319,谢谢. 1. Java知识储备 本知识点不做重点讲解: 对于有基础的同学推荐看<Java编程思想>,巩固基础,查漏补全,了解并熟悉更多细节知识点. 对于没有基础的同学推荐看一本Java基础的书籍,看完后可以继续看<Java编程思想>提升自己. 对于自认为时间很充裕,只要基础学扎实就好的推荐看<疯狂Java讲义>

Android:IPC之AIDL的学习和总结

为了使得一个程序能够在同一时间里处理许多用户的要求.即使用户可能发出一个要求,也肯能导致一个操作系统中多个进程的运行(PS:听音乐,看地图).而且多个进程间需要相互交换.传递信息,IPC方法提供了这种可能.IPC方法包括管道(PIPE).消息排队.旗语.共用内存以及套接字(Socket). Android中的IPC方式有Bundle.文件共享.Messager.AIDL.ContentProvider和Socket. 这次我们学习的是Android中的AIDL. 概述 AIDL(Android接

android学习之remote service 的aidl详解

写在前面的话: 关于remote service中使用aidl来实现跨进程,多线程通信,我是参考了三篇文章,大概把这个弄明白了. (1)android 官方关于aidl的说明文档 docs/guide/components/aidl.html (2)Android学习笔记23服务Service之AIDL和远程服务实现进程通信以及进程间传递自定义类型参数 http://blog.csdn.net/honeybaby201314/article/details/19989455 (3) Androi

【学习笔记】AIDL跨应用Service运用

AIDL:应用程序接口定义语言 注:每当创建或修改AIDL文件后,都需要执行Build->Rebuild Project操作来生效 一.通过一个App控制另一个App的Service 在要调用的App的MainActivity里用intent设置一个部件,参数是部件名字,一个是被调用的包名,一个是被调用的服务类名 然后在要调用的App的MainActivity里用startService和stopService即可控制另一个程序的Service 二.通过一个App绑定另一个App的Service

Android学习小Demo(23)Aidl实现进程间通信

我们知道,Android是靠Binder机制来实现进程间的通信,而上一篇文章中,我们利用AIDL,简单地从代码方面的角度讲解了在服务端中的Binder的存在形式,是以服务的实现存在的,而在客户端,则是以代理的形式,实现存在的只是一个关于服务端的Binder实现的引用. 理论上的东西我们要去学习掌握,但是也不能忽略了实际的动手能力,对吧. 今天,我们就一步一步地利用我们所了解地关于AIDL的知识来实现一个跨进程通信的例子. 在Android的上层应用中,每一个App都是一个单独的进程,所以,要实现

【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件

目录(?)[-] 在AIDL中定义服务接口 根据AIDL文件自动生成接口代码 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Remote Service在之前的学习笔记 Android学习笔记(五三):服务Service(下)- Remote Service中介绍过.远程服允许行其他应用调用,及允许RPC(remote procedure call).在Android中remote需要

Android 学习笔记 Service服务与远程通信...(AIDL)

PS:这一章节看的我有几分迷茫,不是很容易理解...不过还好总算是明白了一大半了...基本的迷惑是解决了... 学习内容: 1.跨应用启动服务... 2.跨应用绑定服务... 3.跨应用实现通信... 由于5.0版本之前和5.0版本之后是有很大的区别的,因此我都会在这里进行具体的介绍... 1.跨应用启动服务...   跨应用启动服务,其实就是多个应用程序之间产生一种沟通关系,应用程序之间可以进行通信或者是完成一些其他的互动,总而言之,就是在我本身的应用程序中去启动其他应用程序的某个服务,这就完