Android 中基于 Binder的进程间通信

摘要:对  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

时间: 2024-10-27 11:22:33

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

Android系统中基于Binder的IPC流程框架分析

前言: Activity.Service.BroadcastReceiver.Content Provider是Android的四大应用程序组件,构成一个完整的应用程序的这些组件可以在同一个进程,也可以不在同一个进程,而当这些组件不在同一个进程,需要进行数据交互时就需要一种IPC(Inter-Process Communication)进程间通信机制来完成,而Binder就是提供了IPC功能的一个框架.实现IPC的整个Binder框架包含几个重要组成部分,它们分别是Binder Driver.C

Android中的Binder机制的简要理解

转载自:http://www.linuxidc.com/Linux/2012-07/66195.htm http://blog.csdn.net/sunxingzhesunjinbiao/article/details/42195013 我们知道,在Android系统中,每一个应用程序都运行在独立的进程中,这也保证了当其中一个程序出现异常而不会影响另一个应用程序的正常运转.在许多情况下,我们activity都会与各种系统的service打交道,很显然,我们写的程序中activity与系统serv

从源码角度分析Android中的Binder机制的前因后果

前面我也讲述过一篇文章<带你从零学习linux下的socket编程>,主要是从进程通信的角度开篇然后延伸到linux中的socket的开发.本篇文章依然是从进程通信的角度去分析下Android中的进程通信机制. 为什么在Android中使用binder通信机制? 众所周知linux中的进程通信有很多种方式,比如说管道.消息队列.socket机制等.socket我们再熟悉不过了,然而其作为一款通用的接口,通信开销大,数据传输效率低,主要用在跨网络间的进程间通信以及在本地的低速通信.消息队列和管道

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

Service 什么是Service 在后台长期运行的没有界面的组件.其他组件可以启动Service让他在后台运行,或者绑定Service与它进行交互,甚至实现进程间通信(IPC).例如,可以让服务在后台处理网络交互,播放音乐,文件I/O,或者与ContentProvider交互. 创建一个Service 新建一个类,继承Service,重写相关方法,如onBind,onUnBind,onCreate,onDestorey. 在AndroidManifest.xml中配置Service和相关权限

Android中基于Socket的网络通信

Socket链接的建立过程: 1.服务器监听 2.客户端发出请求 3.建立链接 4.通信 Socketl特点: 1.Socket基于TCP链接,数据传输有保障 2.Socket适用于建立长时间链接 3.Socket编程通常应用于即时通讯 1 public class MyServerSocket { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated me

Android 手写Binder 教你理解android中的进程间通信

关于Binder,我就不解释的太多了,网上一搜资料一堆,但是估计还是很多人理解的有困难.今天就教你如何从 app层面来理解好Binder. 其实就从我们普通app开发者的角度来看,仅仅对于android应用层的话,Binder就是客户端和服务端进行通信的媒介. AIDL就是我们理解Binder 最好的事例. 我们都知道 我们写好aidl 文件以后,开发工具 会自动帮我们生成好代码.实际上 我们最终apk里面 是只有这些代码的,我们写的aidl文件 是不会被打包进去的,也就是说aidl文件 实际上

Android中的权限管理(基于Permission ProtectionLevel)

1.什么是protectionlevel呢? 我们经常在AndroidManifest中使用权限,如果我们想让应用程序可以发短信,那么应该这样写: <uses-permission android:name="android.permission.SEND_SMS" /> 那么这个权限的定义是在哪里定义的呢?如下: frameworks/base/core/res/AndroidManifest.xml <permission android:name="a

(转载)Android中的Service:Binder,Messenger,AIDL(2)

前言 前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等.在这一篇博文里有一些需要前一篇铺垫的东西,建议没有看过前一篇博文的同学先去看一下前一篇: Android中的Service:默默的奉献者 (1) . 但是在前一篇博文中也有一些遗漏的东西--主要是关于bindService()这一块的具体细节.由于这一块涉及的东西还是比较多,所以在这里单独提出来了.闲话不多说,进入正文. 1.bindServ

Android 基于Message的进程间通信 Messenger完全解析

一.概述 说到Android进程间通信,大家肯定能想到的是编写aidl文件,然后通过aapt生成的类方便的完成服务端,以及客户端代码的编写.如果你对这个过程不熟悉,可以查看Android aidl Binder框架浅析: 当然今天要说的通信方式肯定不是通过编写aidl文件的方式,那么有请今天的主角:Messenger.ok,这是什么样的一个类呢?我们看下注释 This allows for the implementation of message-based communication acr