Android中进程间通信机制AIDL
来源:互联网 发布:网络对人类认知优点 编辑:程序博客网 时间:2024/05/18 18:16
学习AIDL之前,我们需要知道的一个知识点就是,在Android中,其实也就是Linux系统中,进程之间是不能共享内存的。因此,如果我们想要在不同的进程之前进行通信或者数据共享,就要提供一些特殊的机制来实现。也就引出了今天要学习的AIDL(Android Interface Definition Language).
前几天买了vpn,从公司也能上google了。也可以随时fq查文档了。下面就按照Google文档给出的步骤来说明步骤:
总的来说,分为三个大的步骤:
- Create the .aidl file : This file defines the programming interface with method signatures.
Implement the interface : The Android SDK tools generate an interface in the Java programming language, based on your
.aidl
file. This interface has an inner abstract class namedStub
that extendsBinder
and implements methods from your AIDL interface. You must extend theStub
class and implement the methods.Expose the interface to clients : Implement a
Service
and overrideonBind()
to return your implementation of theStub
class.
下面就按照我自己理解的进行描述。第一步首先在工程中创建一个.aidl文件。其声明格式非常简单,和接口的定义类似。如果是使用Android studio开发的话,需要在src下面先创建一个aidl目录,然后在创建.aidl文件。创建好之后,重新build工程,就会自动生成.java文件了。Eclipse中更加简单,直接创建了.aidl文件之后就会自动在gen目录下面生成.Java文件了。自动生成的.Java文件我们不需要做任何的改动。
在学习的过程中,文档中讲有一个Stub类,接下来我们要在服务端实现的就是该类。在服务端创建一个继承于service的自定义service,注意,该service是binder类型的service,所以我们要返回Ibinder对象。要返回的该Ibinder对象就是刚刚自动生成的.java文件中的.stub对象的实例.其实和binder服务很像,只不过是普通的binder类型的service绑定返回的是继承于Binder类的实例对象。由于客户端跨进程返回其他进程的数据,进行通信,所以service中需要进行相应的逻辑处理。具体的逻辑处理就是在.Stub的类中实现的.在进行实现匿名类时,需要实现.aidl文件中定义的所有方法,也就是所要进行的逻辑处理方法,完善好方法,处理好逻辑,将数据进行返回就可以了。服务端就算大工告成了。
接下来,剩下的事情是客户端的工作。首先,需要将服务端刚刚定义的aidl文件拷贝到客户端工程,注意,文件路径等必须和原来在服务端保持一致。很快就要结束了,下面的事情是我们开始绑定服务,之前已经说过,aidl是基于绑定服务的,所以,在要绑定的界面中,应该创建一个绑定连接对象ServiceConnection,一般情况下会直接定义生成一个对象,其中,会自动实现两个方法,第一个叫:onServiceConnected()方法,该方法就是在绑定成功时进行调用,第二个方法是onServiceDisconnected()该方法是在组件与服务进行取消绑定是调用的。我们要做的重点工作就在第一个方法onServiceConnected方法中,我们的目的是进行进程间的通讯,aidl文件会自动生成.java文件,我们要用的就是那个对象,其实最终就是一个代理对象帮我们去远端获取数据,我们本地是从代理对象中拿到的数据。接着上文说,我们需要定义个.aidl类型的变量,然后在onServiceConnected方法中对其进行实例化:实例化代码:xx.Stub.asInterface(service);实例化完该代理对象后,我们就可以用代理对象访问远端的之前已经写好和处理好的方法了,这样就可以返回数据,供我们按到进行使用。最后,为了提高我们的代码质量,我们需要在取消绑定时释放变量内存资源。
上面是文字说明。下面一并把自己写的简单的小例子贴上来:有兴趣的,想看的,可以去git上面clone,自己看一下。
AidlDemo例子Git仓库地址:https://github.com/yuxinburen/AidlDemo.git
git命令:git clone https://github.com/yuxinburen/AidlDemo.git 即可克隆到本地然后导入查看.
进程间通讯传递数据有一些特别的要求和限制:
具体情况为:
1. Java 的原生类型
2. String 和CharSequence
3. List 和 Map ,List和Map 对象的元素必须是AIDL支持的数据类型; 以上三种类型都不需要导入(import)
4. AIDL 自动生成的接口 需要导入(import)
5. 实现android.os.Parcelable 接口的类. 需要导入(import)。
2. String 和CharSequence
3. List 和 Map ,List和Map 对象的元素必须是AIDL支持的数据类型; 以上三种类型都不需要导入(import)
4. AIDL 自动生成的接口 需要导入(import)
5. 实现android.os.Parcelable 接口的类. 需要导入(import)。
0 0
- Android中进程间通信机制AIDL
- Android中IPC(进程间通信)机制之AIDL
- Android进程间通信机制详解-AIDL
- Android中AIDL进程间通信
- Android的进程间通信/AIDL/Message等机制
- 从AIDL开始谈Android进程间Binder通信机制
- 从AIDL开始谈Android进程间Binder通信机制
- android开发框架(五)AIDL进程间通信机制
- Android IPC 进程间通信机制之 AIDL
- Android 进程通信机制之 AIDL
- Android AIDL进程通信机制详解
- android AIDL 进程间通信
- android aidl进程间通信
- Android 进程间通信AIDL
- Android进程间通信--AIDL
- Android进程间通信--AIDL
- android 进程间通信(aidl)
- android AIDL进程间通信
- 开始写博客啦
- POJ 3352 Road Construction(边的双边通)
- php 装配mongo扩展
- 解决MYSQL 中文乱码
- hdu 5452 Minimum Cut (LCA)
- Android中进程间通信机制AIDL
- UI - UIImageViewAndSlider
- 使用Intent传递对象
- cocos2dx Button不是cocos2d::ui 的成员
- 关于重叠io完成例程中的sleepEx()
- 杭电4520小Q系列故事——最佳裁判
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
- tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项
- mpu6050卡尔曼滤波程序及分析