Android Service的基石——Binder

滹水莜人 2015-8-2 标签: 技术

Binder被称为驱动,只是为了强调它会运行在内核态,是操作系统级全局资源,它实质上就是封闭了一套IPC机制,这套IPC机制使用了线程间通信(OS当然知道各个线程了)来实现,也是个二手货。

它的基本运行原理为:申请服务的客户调用驱动(类似于系统调用),拿到驱动中保存的服务句柄,然后用此句柄调用OnTansaction函数(驱动级的),驱动接收参数,挂起当前线程,通知句柄对应线程执行服务端的同名函数返回结果,利用此返回结果唤醒客户线程,将结果返回到客户的用户态中。

客户端调用的过程:

1. 客户端向AwS调用bindService来获取句柄。

public boolean bindService(Intent service, ServiceConnection conn, int flagp);

调用之前需要实现一个接口

Interface ServiceConnection {

public void onServiceConnected(ComponentName name, IBinder service);

public void onServiceDisconnected(ComponentName name);

}

一般会重写此接口,因为此函数在返回时会调用conn.onServiceConnected(),在调用时传入的参数中有目标服务的句柄,所以只需要在函数中把此句柄保存到应用中就行了。

2.  调用句柄的onTransaction()函数。当然目标执行功能号和参数顺序需要查询API了。

驱动处理的过程:

实质上客户端拿到的句柄只是保存在驱动中的句柄,所以客户端调用onTransaction时调用到的也只是驱动处的函数,这个函数执行默认的处理流程:

向保存的服务端线程发送对应的消息

挂起调用线程,等服务端线程处理完成后notify通知。

接收到通知,唤醒并执行调用线程,返回到客户端代码区。

服务端处理的过程:

服务端线程收到消息,调用onTransaction回调函数,在函数中根据参数和消息号来执行对应的功能。

将执行结果通过消息传给驱动代码。

本文相关标签: android ibinder

赞助商

发表评论: