参考自:

参考自:<Android内核剖析>一书

 

 

1.Binder工作在Linux层面,属于一个驱动,但这个驱动不需要硬件,仅是基于一小段内存。从线程的角度讲,Binder驱动代码运行在内核态,客户端程序调用Binder是通过系统调用完成。

2.Binder是一种架构,主要提供了(服务器端接口,Binder驱动,客户端接口,Service Manager)三个模块。Service Manager,它是整个Binder机制的守护进程,用来管理开发者创建的各种Server,并且向Client提供查询Server远程接口的功能

 

a.服务器端:Binder服务器端(实际上就是一个Binder对象),对象一旦创建,会有一个隐藏线程(用来接收Binder驱动发送的信息);收到消息后,会执行Binder对象中的onTransact()函数(会根据参数不同执行不同的服务代码)。




韦东山 android 全集 韦东山安卓视频_客户端


 

 

 

b.Binder驱动:任意一个服务端Binder对象被创建时,同时会在Binder驱动中创建一个mRemote(Binder类)对象(不会再额外产生一个线程);客户端要访问远程服务时,都是通过mRemote对象完成的。

重载transact(),具体实现:

1.向服务端线程发送消息。

2.挂起当前线程,等待服务端执行完成的通知。

3.接到通知,继续执行客户端线程,并返回执行结果。

 

 

c.客户端:分2种,本地调用和远程调用。 获取Binder驱动中的mRemote 调用transact()

1.本地调用:可直接通过获取到Binder mRemote对象访问

 

 

2.远程调用:需要通过获取代理访问

 

transact(int code,Parcel data,Parcel reply,int flags),是后个flags(0/1)代表 :0代表双向的,即有传递也有返回,1代表单向,没有返回数据;

 

------------------------------------------------

客户端定义不同的code与数据 通过Binder驱动传递给 服务端, 服务端通过与客户端定义好对应code解析传递的值

------------------------------------------------

使用Service:

ContextImpl (通过bindService())-> Ams (scheduleBindService())-> ActivityThread (回调ServiceConnection的onBind().)-> ContextImpl

 

ServiceManager(管理服务)

        我们都知道,作为客户端要想获得服务代理,首先要向ServiceManager查询Service,然后创建并返回服务代理对象,再通过代理对象和Service通讯。当然,在Java层面也是这样,所以客户端首先也要获取ServiceManager这个系统服务的服务代理,再同这个代理来查询并请求服务。

ServiceManagerNative