Android中Binder的基础知识点

Android Binder基础知识点

一 传统IPC和Binder机制的比较

传统IPC:

1)收方无法获得对方进程可靠的UID/PID,从而无法鉴别对方身份。

2)接入点开放,无法建立私有通道。

3)socket, 管道和消息队列需要两次数据拷贝,传输效率差。

4)共享内存的方式控制复杂,难以使用。

Binder机制:

1)为发送方添加UID/PID身份。

2)既支持实名Binder也支持匿名Binder。

3)传输过程只需要一次拷贝。

二 Binder中的面向对象思想

Binder对象是一个可以跨进程引用的对象,它的实体位于一个进程中,它的引用却遍布与系统的各个进程之中。这个引用和java里的引用一样,可以使强类型也可以使弱类型,而且可以从一个进程传递给其他进程。

三 Binder的通信模型

用户空间:Server,Client,ServiceManager;内核空间:Binder驱动。

Binder驱动:和硬件没有关系,但实现方式和设备驱动一样,工作于内核态,用户通过/dev/binder访问它。

ServiceManager:和DNS类似,将字符形式的Binder名字转化成Client中对该Binder的引用。

Server:Server到ServiceManager的通信也是Binder实现,Server通过固定的0引用来获取ServiceManager的Binder引用。

Client:Client通过名字获取Server注册的Binder引用。这些指向Binder的引用是强类型,从而确保只要有引用Binder实体就不会被释放掉。Client和Server直接还可以通过实名Binder发送匿名Binder,别的进程无法通过穷举或猜测获取匿名Binder的引用。

四 通过AIDL使用Binder

Android会将AIDL文件转化成一个IInterface接口,接口内会有一个实现此接口并继承Binder的Stub存根类,Server通过Stub的具体实现类来提供一系列的业务操作。

Stub的内部会有一个继承Stub的Proxy代理类,Client通过Stub的asInterface方法获取Proxy的实例,来远程访问Server提供的方法。

这是一个典型的存根-代理模式,使得上层代码不用考虑IPC的底层实现细节。

另外,AIDL接口除了传递Java基本类型外,还可以传递任何实现Parcelable接口的复杂类型。AIDL接口还可以传递另一个AIDL接口,注意,这本质上就是一个匿名Binder,Server可以通过Client传递的AIDL接口反向调用Client中的方法,在这里要注意内存溢出的问题。

时间: 2024-07-28 18:39:23

Android中Binder的基础知识点的相关文章

Android中Canvas绘图基础详解(附源码下载)

Android中,如果我们想绘制复杂的自定义View或游戏,我们就需要熟悉绘图API.Android通过Canvas类暴露了很多drawXXX方法,我们可以通过这些方法绘制各种各样的图形.Canvas绘图有三个基本要素:Canvas.绘图坐标系以及Paint.Canvas是画布,我们通过Canvas的各种drawXXX方法将图形绘制到Canvas上面,在drawXXX方法中我们需要传入要绘制的图形的坐标形状,还要传入一个画笔Paint.drawXXX方法以及传入其中的坐标决定了要绘制的图形的形状

理清Android中Binder机制的使用

---恢复内容开始--- 昨天好不容易把Binder的使用方式搞清楚了,今天看代码的时候又被轰炸地体无完肤.最主要的问题是,在系统service和client的交互中,Binder使用的太频繁了,一次调用可能伴随着多个Binder的多次传递,不搞清楚这些Binder的来源和具体作用,往往就无法深刻理解交互是如何进行的.另外,对于Binder子类的命名方式又非常繁杂,这间接导致了代码阅读理解的困难.今天决定花些时间好好梳理下交互过程中Binder的具体使用,在此记录. 在开始前,先声明下个人对Bi

Android中Canvas绘图基础详解

原文:http://blog.csdn.net/iispring/article/details/49770651 Android中,如果我们想绘制复杂的自定义View或游戏,我们就需要熟悉绘图API.Android通过Canvas类暴露了很多drawXXX方法,我们可以通过这些方法绘制各种各样的图形.Canvas绘图有三个基本要素:Canvas.绘图坐标系以及Paint.Canvas是画布,我们通过Canvas的各种drawXXX方法将图形绘制到Canvas上面,在drawXXX方法中我们需要

Android中的Service基础

Service主要用于后台程序和跨进程访问,可以在不显示界面的前提下完成任务,不影响用户的其他操作. 这里我展示一些基本的用法 新建一个Service类 package com.example.service; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.widget.Toast; pub

Android中webView的基础使用(一)

WebView是View的一个子类,可以让你在activity中显示网页. 可以在布局文件中写入WebView:比如下面这个写了一个填满整个屏幕的WebView: 1 <?xml version="1.0" encoding="utf-8"?> 2 <WebView xmlns:android="http://schemas.android.com/apk/res/android" 3 android:id="@+id

Android中View的基础知识

View的界限 View就是我们看到的界面,有四个界限范围分别是, Top/Left, Bottom/Right,坐标系从左上到右下.这四个值可以通过任何View的子类调用getTop()/get...得到. 但是坑爹的是这些不能在生命周期函数里调用,否则都返回0,因为绘制还没完成呢,可以放在button的onclicklistener中. 事件的种类 分为MotionEvent和TouchSlop,分为ACTION_DOWN, ACTION_MOVE, ACTION_UP. MotionEve

Android 中基于 Binder的进程间通信

摘要:对  Binder 工作机制进行了分析. 首先简述 Android 中 Binder 机制与传统的 Linux 进程间的通信比较,接着对基于 Binder 进程间通信的过程分析 最后结合开发实例 (AIDL),了解 基于 Binder的进程间通信. 1.Android 采用 Binder 作为 IPC (Internet Process Connection) 机制的优势     Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道

Android中的Drawable菠菜bc网站搭建架设基础与自定义Drawable

6.gravity属性详情 可选项 含义top/bottom/left/right 将图片放在容器上/下/左/右,不改变图片大小center_vertical/horizontal 垂直居中/水平居中,不改变图片大小center 水平和垂直方向同时居中,不改变图片大小fill_vertical/horizontal 垂直/水平方向填充容器fill 水平和垂直方向同时填充容器clip_vertical/horizontal 垂直/水平方向的裁剪-较少使用7.NinePatchDrawable(.9

Android中Canvas绘图之Shader使用图文详解

概述 我们在用Android中的Canvas绘制各种图形时,可以通过Paint.setShader(shader)方法为画笔Paint设置shader,这样就可以绘制出多彩的图形.那么Shader是什么呢?做过GPU绘图的同学应该都知道这个词汇,Shader就是着色器的意思.我们可以这样理解,Canvas中的各种drawXXX方法定义了图形的形状,画笔中的Shader则定义了图形的着色.外观,二者结合到一起就决定了最终Canvas绘制的被色彩填充的图形的样子. 类android.graphics