2024年4月16日发(作者:)

在前面几篇文章中,我们详细介绍了Android系统进程间通信机制Binder的原理,

并且深入分析了系统提供的Binder运行库和驱动程序的源代码。细心的读者会发现,这几

篇文章分析的Binder接口都是基于C/C++语言来实现的,但是我们在编写应用程序都是

基于Java语言的,那么,我们如何使用Java语言来使用系统的Binder机制来进行进程间

通信呢?这就是本文要介绍的Android系统应用程序框架层的用Java语言来实现的

Binder接口了。

熟悉Android系统的读者,应该能想到应用程序框架中的基于Java语言的Binder

接口是通过JNI来调用基于C/C++语言的Binder运行库来为Java应用程序提供进程间通

信服务的了。JNI在Android系统中用得相当普遍,SDK中的Java接口API很多只是简

单地通过JNI来调用底层的C/C++运行库从而为应用程序服务的。

这里,我们仍然是通过具体的例子来说明Binder机制在应用程序框架层中的Java

接口,主要就是Service Manager、Server和Client这三个角色的实现了。通常,在应

用程序中,我们都是把Server实现为Service的形式,并且通过

vice接口来把这个Service添加到Service Manager,Client

也是通过vice接口来获得Service接口,接着就可以使用这个

Service提供的功能了,这个与运行时库的Binder接口是一致的。

前面我们学习Android硬件抽象层时,曾经在应用程序框架层中提供了一个硬件访

问服务HelloService,这个Service运行在一个独立的进程中充当Server的角色,使用这

个Service的Client运行在另一个进程中,它们之间就是通过Binder机制来通信的了。

这里,我们就使用HelloService这个例子来分析Android系统进程间通信Binder机制在

应用程序框架层的Java接口源代码。所以希望读者在阅读下面的内容之前,先了解一下前

面在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务这篇文

章。

这篇文章通过五个情景来学习Android系统进程间通信Binder机制在应用程序框

架层的Java接口:1. 获取Service Manager的Java远程接口的过程;2. HelloService

接口的定义;3. HelloService的启动过程;4. Client获取HelloService的Java远程接口

的过程;5. Client通过HelloService的Java远程接口来使用HelloService提供的服务

的过程。

一. 获取Service Manager的Java远程接口

我们要获取的Service Manager的Java远程接口是一个ServiceManagerProxy

对象的IServiceManager接口。我们现在就来看看ServiceManagerProxy类是长什么样

子的: