IPC机制:应用于android中的进程间通信
android中实现IPC机制的方法一共有以下几种:
1. AIDL
2. Messenger
3. ContentProvider
4. socket
其中前两者是基于Binder机制。第三个是基于AIDL, 那么, 首先我们来了解一下什么是Binder机制吧.
什么是Binder机制?
这绝对是个头疼的问题 , 因为涉及到Linux知识和C/C++, 我也很头疼, 但是这并不妨碍我们去使用它. 这里我引用老罗的一段话Android进程间通信(IPC)机制Binder简要介绍和学习计划, 从基本的层面去了解Binder:在Android系统的Binder机制中,由一系列系统组件组成,分别是Client、Server、Service Manager和Binder驱动程序,其中Client、Server和Service Manager运行在用户空间,Binder驱动程序运行内核空间。Binder就是一种把这四个组件粘合在一起的粘结剂了,其中,核心组件便是Binder驱动程序了,Service Manager提供了辅助管理的功能,Client和Server正是在Binder驱动和Service Manager提供的基础设施上,进行Client-Server之间的通信。Service Manager和Binder驱动已经在Android平台中实现好,开发者只要按照规范实现自己的Client和Server组件就可以了.
建议有时间一定要深入去学习了解Binder机制, Binder机制无论从系统开发还是应用开发的角度来看,都是Android系统中最重要的组成.
AIDL实现进程间的通信
先注明出处Android应用中通过AIDL机制实现进程间的通讯实例
在Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然,Java中是不支持跨进程内存共享的,因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达到跨界对象访问的目的。在Android中,则采用AIDL(Android Interface Definition Language :接口定义语言)方式实现。
AIDL (Android Interface Definition Language)是一种IDL语言,用于生成可以在Android设备上两个进程之间进行进程间通信(IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。
AIDL IPC机制是面向接口的,它是使用代理类在客户端和实现端传递数据。
上面链接是使用AIDL实现IPC服务的基本步骤, 开发工具是Eclipse.
Android Studio实现AIDL小栗子
AIDL接口
- 首先,创建一个aidl文件, 文件后缀为.aidl , 它是一个接口, 这个接口里面定义了要对外提供的服务.
- 创建好后,Rebuild一下我们的项目,可以生成同名的java文件。这是一个接口,里面包含了一个名为Stub的静态抽象类,以及我们在aidl文件中定义的加减法函数。
AIDL接口的创建到这里就算完成了.
服务端
在service中,我们使用刚刚生成的IxxAIDL.Stub静态抽象类(系统在帮我们生成的时候继承了Binder并且实现了IxxAIDL,它在负责与客户端的Binder进行通信交互的同时,它也维护了service描述符与服务端service的映射) 创建了一个Binder对象(用于和客户端进行通信。),实现了接口中的方法,并在onBind方法中返回它。(别忘了注册哦)客户端
调用AIDL服务首先要绑定服务,才能获得客户端的Binder对象(此Binder是用来与服务端进行通信), 但是绑定服务需要传入一个serviceConnection对象.new一个ServiceConnection对象:
private ServiceConnection mConnection=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //连接成功时调用 Log.e(TAG,"connect"); binded=true; mxxAIDL=IxxAIDL.Stub.asInterface(service); //获得客户端Binder对象 } @Override public void onServiceDisconnected(ComponentName name) { Log.e(TAG,"disconnect"); mxxAIDL=null; binded=false; } };
值得注意的是:
服务端onBind方法返回的Binder和客户端asInterface方法获得的Binder并不是同一个Binder对象.