摘要:对  Binder 工作机制进行了分析。 首先简述 Android 中 Binder 机制与传统的 Linux 进程间的通信比较,接着对基于 Binder 进程间通信的过程分析 最后结合开发实例 (AIDL),了解 基于 Binder的进程间通信。

1、Android 采用 Binder 作为 IPC (Internet Process Connection) 机制的优势

    Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道、信号和跟踪、插口、报文队列、共享内存和信号量。但是Linux 进程间通信方式存在着增加进程的开销、 进程过载和安全漏洞等方面的问题。在 Android 系统中,Binder IPC 进程间通信机制可以有效地解决这些问题。

Binder的优势:

①高效率: Binder 传输只需要一次拷贝,而管道、消息队列、Socket都需要拷贝两次,对于移动设备,性能一直是个大问题;

②安全性高: Binder 机制对于通信双方的身份是内核进行校检支持的,socket 方式只需要知道地址都可以连接;

③易用性: B/S模式的通信,如果管道/消息队列还得进行包装,而Binder使用面向对象的方式设计,进行一次远程过程调用就像调用本地对象;

2、基于 Binder 进程间通信的过程分析

Binder IPC 方式使得两个进程间的通信像是一个进程进入另外一个进程执行代码, 并带着运行结果返回,这类似于一个“轻量级” 的远程调用过程 。

Binder 机制是通过 Server /Client 架构实现的,主要包括Server,Client,Service Manager以及Binder驱动。其中Server,Client,Service Manager运行于用户空间,驱动运行于内核空间。(如下图)

3、结合开发实例 (AIDL)

3.1 案例需求假设

一个应用的 Service 提供一本书名的信息的远程服务,作为服务端,另外一个应用中的 Activity 想获取 一本书名的信息。 Android的数据传递采用 Aidl 的方式。

3.2 案例分析
  Android 的不同应用不能共用数据, 因此如果有需要的话只能通过进程间通讯来完成应用共享数据。

进程间通讯(ipc)涉及到三个部分:客户端(调用方),传递数据,服务(被调用方)。其中服务端 Service 被同一个应用调用和不同应用调用原理是不同的。

因此分成以下两种:

①本地服务(Local Service):Service 被同一个应用中的 Activity 调用,用于实现应用程序自己的一些耗时任务。

②远程服务(Remote Sercie):可以被其他应用程序复用,比如 WiFi 服务,其他应用程序不需要再写这样的服务,调用已有的即可。

该案例选择本地服务即可。

3.3  AIDL案例实现原理

从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当你bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象。

通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据。(如下图)

3.4 AIDL案例实现步骤

①创建一个BookInfo类 继承Service

②创建一个IBookInfo接口,写对应的AIDL文件的方法


 private String getNames(){
        Log.e("JianChengLoveBianCheng", "MyService.getName");
        return "《平凡的世界》";
    }

③在功能清单文件中注册服务

 <service android:name="com.example.aidl.BookInfo" >
            <intent-filter>
                <action android:name="com.JCLoveBiancheng.binder.action.AIDLService" />
            </intent-filter>
        </service>

④将AIDL 文件生成的类,在服务中绑定


private final IBookInfo.Stub mBinder = new IBookInfo.Stub() {
        @Override
        public String getName() throws RemoteException {
            Log.e("JianChengLoveBianCheng", "MyService.AIDLService.getName");
            return getNames();
        }
    }; //找不到IBookInfo的话,rebuild project即可

⑤绑定方式启动Service

  private IBookInfo mService;//服务的代理类
    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            Log.e("JCLoveBiancheng", "MainActivity.onServiceConnected");
            mService = IBookInfo.Stub.asInterface(service);
        }

        public void onServiceDisconnected(ComponentName className) {
            Log.e("JCLoveBiancheng", "MainActivity.onServiceDisconnected");
            mService = null;
        }
    };

⑦开启服务

Intent intent = new Intent(MainActivity.this,BookInfo.class);
            intent.setAction("com.JCLoveBiancheng.binder.action.AIDLService");
            bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

⑧点击按钮即可从服务中获取信息(如下图)

点击Bind服务打印出:

点击UnBind服务打印出:

点击获取信息打印出:

附加:

AIDL 支持的数据类型
    基本数据类型:int、long、char、boolean、double 、String 和 CharSequence
    List:
    只支持ArrayList,里面的每一个元素都必须能够被 AIDL 支持
    Map:
    只支持 HashMap,里面的每一个元素都必须能够被 AIDL 支持
    Parcelable:
    所有实现了 Parcelable 接口的对象
    AIDL:
    所有的 AIDL 接口本身也可以在 AIDL文件中使用。

Demo下载地址: http://files.cnblogs.com/files/wujiancheng/aidl%E5%B0%8F%E6%A1%88%E4%BE%8B.zip

Android 中基于 Binder的进程间通信的更多相关文章

  1. Android中的Binder机制的简要理解

    转载自:http://www.linuxidc.com/Linux/2012-07/66195.htm http://blog.csdn.net/sunxingzhesunjinbiao/articl ...

  2. Android零基础入门第35节:Android中基于回调的事件处理

    原文:Android零基础入门第35节:Android中基于回调的事件处理 通过前面两期掌握了Android中基于监听的事件处理的五种形式,那么本期一起来学习Android中基于回调的事件处理. 一. ...

  3. Android零基础入门第34节:Android中基于监听的事件处理

    原文:Android零基础入门第34节:Android中基于监听的事件处理 上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本 ...

  4. 「Android」 基于Binder通信的C/S架构体系认知

    C/S架构(Client/Server,即客户机/服务器模式)分为客户机和服务器两层:第一层是在客户机系统上结合了表示与业务逻辑,第二层是通过网络结合了数据库服务器.简单的说就是第一层是用户表示层,第 ...

  5. Android中基于Socket的网络通信

    1. Socket介绍 2. ServerSocket的建立与使用 3. 使用ServerSocket建立聊天服务器-1 4. 使用ServerSocket建立聊天服务器-2 5. 在Android中 ...

  6. Android中的Service与进程间通信(IPC)详解

    Service 什么是Service 在后台长期运行的没有界面的组件.其他组件可以启动Service让他在后台运行,或者绑定Service与它进行交互,甚至实现进程间通信(IPC).例如,可以让服务在 ...

  7. Android中基于CGroup的memory子系统HAL层分析-lmkd

    Android在内存管理上于Linux有些小的区别,其中一个就是引入了lowmemorykiller.从lowmemorykiller.c位于drivers/staging/android也可知道,属 ...

  8. android中基于HTML模板的方式嵌入SWF

    继上一篇 利用webview实现在andorid中嵌入swf 这篇继续说说通过html模板的方式来嵌入SWF,这样做的好处最直观的就是可以把html,swf和android代码串起来,交互操作很方便( ...

  9. 34、Android中基于Socket的网络通信(一)

    Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求. 在java中,Socket和ServerSocket类库位于java.net包中,ServerSocket用于服 ...

随机推荐

  1. Odoo安装

    打开终端机0. sudo passwd root #设定超级使用者密码1. sudo apt-get update #更新软件源2. sudo apt-get dist-upgrade #更新软件包, ...

  2. [bzoj1070][SCOI2007]修车——费用流

    题目大意: 传送门 题解: 本题和(POJ3686)[http://poj.org/problem?id=3686]一题一模一样,而且还是数据缩小以后的弱化版QAQ,<挑战程序设计竞赛>一 ...

  3. [Mysql] "Too many connections"

    刚刚在项目中遇到mysql数据库连接不够的问题,查了一点资料,记录下.异常信息主要为:Data source rejected establishment of connection, message ...

  4. 配置opencv环境

    包含目录:解决代码报错问题 F:\ndk\opencv-windows\opencv\build\include;F:\ndk\opencv-windows\opencv\sources\includ ...

  5. C语言对齐

    "%-md":左对齐,若m比实际少时,按实际输出.(m为整数) "%md":右对齐,若m比实际少时,按实际输出. 我自己编了一个,给你看看实际效果: #incl ...

  6. vue生命周期的介绍

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. BZOJ 3299: [USACO2011 Open]Corn Maze玉米迷宫(BFS)

    水题一道却交了4次QAQ,真是蒟蒻QAQ CODE: #include<cstdio>#include<iostream>#include<cstring>#inc ...

  8. JavaScript内置对象-Array

    ▓▓▓▓▓▓ 大致介绍 除了Object之外,Array类型恐怕就是JavaScript种最常用的类型了,JavaScript中的数组与其他语言中的数组有很大的区别,例如,数组的每一项可以存放任何值, ...

  9. UI设计需具备的几大素质

    近年来,IT产业对于高端技术人才需求加大,特别是北上广和知名企业对人才需求更为迫切,UI设计人员的正在接受UI培训的学员都赢认识到UI设计在未来要求将越来越高,交互设计越来越新颖也将对用户更加友好,兄 ...

  10. 手把手教你用Mysql-Cluster-7.5搭建数据库集群

    前言 当你的业务到达一定的当量,肯定需要一定数量的数据库来负载均衡你的数据库请求,我在之前的博客中已经说明了,如何实现负载均衡,但是还有一个问题就是数据同步,因为负载均衡的前提就是,各个服务器的数据库 ...