Binder是什么

Binder是运行在Android内核态用于进程间通信(IPC)的驱动,采用C/S架构,由三项基本组件组成:Binder服务端,Binder驱动,应用程序客户端。

为什么要用Binder

Android需要为运行中的不同的进程提供全局的服务,使进程之间能相互通信。

Binder的运作机制

Binder的三个组件:Binder服务端,Binder驱动,应用程序客户端。Binder服务端代码级表现为一个继承Binder的类(重载onTransact()),Binder驱动的代码级表现为一个mRemote对象(同样继承Binder类,重载transact()),mRemote在Binder服务端与应用程序客户端之间中转。

Binder的远方服务端为所有应用进程提供全局服务,它维护一个隐藏的线程(初始化对象时即创建),该线程接收Binder驱动发送过来的消息,将参数传给onTransact(),由onTransact()处理请求,并且返回数据,实现Binder时,需要将onTransact()重载以提供处理代码。

onTransact(int code,Parcel data,Parcel reply,int flags)throw RemoteException{

//此处添加处理代码

return super.onTransacet(int code,Parcel data,Pacel reply,int flags);

}

问题1;Binder服务端如何知道客户端需要调用哪个服务,又到哪里找客户端传来的参数?

回答:code参数标示了客户端期望服务端调用的功能,data参数保存了客户端传过来的数据,客户端需要按顺序将参数存入data中,服务端也需要按顺序从data中读取数据。

问题2:Binder服务端如何返回数据?

回答:通过调用reply变量中相关函数往其写入数据即可,如果返回数据,flags参数必须为0,否则必须为1。

Binder驱动中的mRemote需要重载transact(),并且实现三件事:向服务端发送调用信息->挂起当前线程,等待服务端返回后恢复->返回服务端的结果。

客户端与服务端通信需要获得Binder驱动中的mRemote对象的引用,并且调用mRemote.transact(int code,Parcel data,Parcel reply,int flags)。原型如下:

public final boolean transact(int code,Parcel data,Parcel reply,int flags);

方法中各参数的意义与服务端的onTransact()方法中各参数一样。

Android SDK提供aidl工具生成代码重载transact()和onTransact()并统一传入data和读取data中参数的顺序。

------参考至《Android内核剖析》

BInder浅析的更多相关文章

  1. Android aidl Binder框架浅析

      转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38461079 ,本文出自[张鸿洋的博客] 1.概述 Binder能干什么?B ...

  2. Binder的工作原理浅析

    在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制. ...

  3. 图文浅析Binder机制

    总述: Binder是Android系统提供的一种IPC机制,Android系统基本就可以看做基于Binder的C/S架构,Binder也是C/S形式出现,它属于驱动但是驱动的一段内存而不是设备,框架 ...

  4. ANDROID BINDER机制浅析

    Binder是Android上一种IPC机制,重要且较难理解.由于Linux上标准IPC在灵活和可靠性存在一定不足,Google基于OpenBinder的设计和构想实现了Binder. 本文只简单介绍 ...

  5. Android 进阶8:进程通信之 Binder 机制浅析

    读完本文你将了解: IBinder Binder Binder 通信机制 Binder 驱动 Service Manager Binder 机制跨进程通信流程 Binder 机制的优点 总结 Than ...

  6. Binder的工作机制浅析

    在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制. ...

  7. Android Binder实现浅析-Binder驱动

    简介 Android是如何实现跨进程通信的,大家熟悉的Binder是什么,怎么设计的,进程间的数据如何发送接收的.本文将以及解析,并对Binder驱动实现.Native层实现.Java层实现三块做一个 ...

  8. Camera服务之--架构浅析

    Camera服务之--架构浅析 分类: Camera 分析2011-12-22 11:17 7685人阅读 评论(3) 收藏 举报 android硬件驱动框架jnilinux内核平台 一.应用层 Ca ...

  9. Android-Binder原理浅析

    Android-Binder原理浅析 学习自 <Android开发艺术探索> 写在前头 在上一章,我们简单的了解了一下Binder并且通过 AIDL完成了一个IPC的DEMO.你可能会好奇 ...

随机推荐

  1. 显示C++ vector中的数据

    C++ 中的vector是一个容器数据类型,不能使用cout直接显示容器中的值. 以下程序中,myvector 是一个vector数据类型.将myvector替换为需要输出的vector. for(i ...

  2. 如何使用ABSL代码调用Web service

    需求:在C4C UI里创建web service(maintain ticket),然后通过ABSL代码消费. 1. 创建一个新的Communication Arrangement 基于Manage ...

  3. Leetcode 22. Generate Parentheses Restore IP Addresses (*) 131. Palindrome Partitioning

    backtracking and invariant during generating the parathese righjt > left  (open bracket and cloas ...

  4. C++学习之继承中的成员访问控制

    由基类到派生类的过程中,在派生类里如何访问基类成员,以及派生类对象如何访问基类成员,是根据派生类在从基类派生时是以什么方式进行的派生:public.protect或者private.下面说一下在这三种 ...

  5. 散度(Divergence)和旋度(Curl)

    原文链接 散度(Divergence) 散度的讨论应从向量和向量场说起.向量是数学中研究多维计算的基本概念.比如,速度可以分解为相互独立的分量,则速度就是一个多维的向量.假如空间中的每一个位置都有一个 ...

  6. centos install rtl8188ce driver

    1.导入公钥,注意大小写. rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org 2.安装ELRepo库. rpm -Uvh http://elr ...

  7. extjs3EmptyText 上传自动清空的问题

    在extjs3表单的操作中,输入框经常有提示性的默认字段,比如: // === 接入单位的Form表单 ====== var jrdwForm = new Ext.form.FormPanel({ b ...

  8. C#中this保留字的用法

    一.this保留字 this保留字一般只在构造函数.类的方法和类的实例中使用.它有以下含义: ?在类的构造函数中出现的this,则作为一个值类型,表示对正在构造的对象本身的引用. ?在类的方法中出现的 ...

  9. 写给iOS小白的MVVM教程(一): 从MVC到MVVM之一个典型的MVC应用场景

    前言 本着实践为主的原则,此系列文章不做过多的概念性的阐述和讨论;更多的代码和篇幅用来展示MVC和MVVC下的基础代码结构与具体实现,来展示各自优劣.这篇文章,更多的在于发掘MVC与MVVC的共性,以 ...

  10. 关于js的严格模式

    最近在看你不知道js,补充自己的js基础,加深理解.在读的过程中写点笔记. 严格模式下与非严格模式的区别 . 严格模式是es5新增的,es6是默认为严格模式的!js默认状态下是非严格模式的!   一般 ...