赞
踩
做Android APP开发的过程中,会经常需要调用类似于下面这样的函数:
WifiManager mWifiManager = (WifiManager)getSystemService(Context.WIFI_MANAGER_SERVICE);
这个WifiManagerService就是运行在Android系统后台,为应用提供接口支持的系统服务。这些系统服务在开机的过程中启动,运行于系统进程中。
使用系统服务提供接口的三大优点就是:好用!好用!好用!(重要的事情说三遍)。APP开发者需要做的事情就是通过上面的库函数获取一个系统服务的代理,然后就可以通过代理来控制硬件。所有的扩进程调用都不需要考虑了。就算系统服务崩掉,系统服务也能自动重启。
使用系统服务的第四大优点是易于版本控制。所有的版本控制都是由Android中间件的开发者完成的,Android中间件开发者只需提供一个可用的固件即可。就算是APP和固件的版本不匹配,系统也只会报一个RemoteException,APP在捕获这个Exception之后,就能做到版本的兼容。
用这种方式提供接口的缺点也是很明显的,就是工作量都交给Android中间件的开发者了。虽然编写系统服务的代码开上去很复杂,但是跟着我下一篇博博文的步骤来做,也是能很容易的实现的。
Android的系统服务是一个典型的客户端/服务器模型(见下图)。
每一个用户(APP)都拥有一个XXXManager对象的实例(客户端)。APP通过XXXManager的一个实例与XXXManagerService(服务器)进行交互。APP与XXXManager运行于用户进程,而XXXManagerService运行于系统该进程中。这种跨进程的交互完全由XXXManager来完成,用户是不需要知道其实现的细节。
在Android系统中,这样的系统服务有很多。各种Manager的代码在frameworks\base\core\java\android\os目录下,各种ManagerService的代码在frameworks\base\services\java\com\android\server。这些代码将是我们编写自己的服务的重要参考资料。当你不知道怎么实现一个功能的时候,都能从中找到参考的代码。
运行于用户进程的各种Manager是如何与各种ManagerService进行交互的呢?这就用到了Android里大名鼎鼎、随处可见的Binder。Binder是什么,各位自己去查一下,这里不做讨论。
总的来说,Binder的实现也有以下两种方式:
ManagerService可以完全由C++来实现,然后通过Binder这种机制与用Java实现的Manager进行交互。这样的系统服务比较典型的是MediaService。使用C++来实现的优点很明显,效率高。但是对于Java和.Net程序员的我来说,阅读面向对象的C++代码是非常痛苦的,处理各种指针是很容易出错的。所以在对效率没有那么高的要求的情况下,我推荐使用Java实现。
Java实现的ManagerService与Manager之间的交互是通过AIDL来实现的。AIDL的全称是Android Interface Describe Language。这个东西在上一篇博文里面也提到过。那个时候的用法是把AIDL文件直接交给APP,由APP来处理IPC,APP开发者就需要具备AIDL的知识。而这里,我们在系统服务于与APP之间增加了一个Manager,AIDL的代码完全由Manager来实现,这样用户就不需要知道AIDL的实现细节了(像我这样的为APP开发者考虑的系统开发者已经很少见了)。
在下一篇博文中,我将给出一个实现系统服务的步骤和例子。敬请期待!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。