简单理解IPC机制和AIDL的使用

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机制中,由一系列系统组件组成,分别是ClientServerService ManagerBinder驱动程序,其中Client、Server和Service Manager运行在用户空间,Binder驱动程序运行内核空间。Binder就是一种把这四个组件粘合在一起的粘结剂了,其中,核心组件便是Binder驱动程序了,Service Manager提供了辅助管理的功能,Client和Server正是在Binder驱动和Service Manager提供的基础设施上,进行Client-Server之间的通信。Service Manager和Binder驱动已经在Android平台中实现好,开发者只要按照规范实现自己的Client和Server组件就可以了.

    Binder机制
    建议有时间一定要深入去学习了解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接口

    1. 首先,创建一个aidl文件, 文件后缀为.aidl , 它是一个接口, 这个接口里面定义了要对外提供的服务.
    2. 创建好后,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对象.

**以上是AIDL的简单使用, 有任何问题欢迎留言交流指正.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值