http://www.ibm.com/developerworks/cn/opensource/os-cn-android-location/index.html#major2
其中介绍了整个GPS定位的代码框架。
下面针对其中的网络定位做一些补充: LocationManangerService在systemServer中被启动创建,同时执行其systemReady方法(所有其他级别的服务都是这样的执行流程),这个方法中开启了一个线程,创建了一个属于它的handler用于控制service的工作,并开始init初始化,在这里定位服务加载当前系统所支持的LocationProvider。
这里有关的三个类分别是:
LocationProviderProxy.java是框架中用来封装远程服务端操作的类,名为Proxy其实是服务端本地代理的装饰类。
ServiceWatcher.java充当了一个远程服务管理者,用于绑定服务以及管理服务的本地代理。
ILocationProvider.aidl定义了定位服务的接口,网络定位提供商按照这个接口约束来实现。
LocationProviderBase.java定义了网络定位提供商实现接口的虚类,内部实现了以上的桩类,并留了一组虚方法用于具体实现。
看这些类就知道对于网络定位来说LocationManangerService是一个客户端,网络定位模块是一个服务端,是通过ILocationProvider.aidl来实现的。
这样整个流程就是这样的:
LocationManangerService服务中通过binder远程服务(注意这里的Action是:com.android.location.service.v2.NetworkLocationProvider)并使用其LocationProviderProxy本地代理来进行的操作,Proxy实现LocationProviderInterface使得服务使用起来和其他LocationProvider一致实现运行时的动态绑定,远程端扩展LocationProviderBase实现其onEnable,onSetRequest等一系列虚方法来完成定位的操作。
一般手机中的网络位置服务都是基于第三方的比如百度,谷歌等,所以这部分代码没有在源码中看到,但是可以分析一下源码中的FusedLocationProvider.java,这个与NetworkLocationProvider的架构是一致的。
原文地址: http://blog.csdn.net/hehui1860/article/details/38560953