Android GPS架构分析

2026/4/27 10:19:08

Android GPS架构分析

Daniel Wood 20101222

转载时请注明出处和作者

文章出处:http://danielwood.cublog.cn 作者:Daniel Wood

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

在底层得到gps的接口之后, if (GpsLocationProvider.isSupported())(在文件LocationManagerService.java中调用)语句得到true,然后进行下一步操作,在这里new了一个GpsLocationProvider对象。代码如下: GpsLocationProvider gpsProvider = new GpsLocationProvider(mContext, this); 注意GpsLocationProvider构造函数里面的两个参数:mContext, this。下面来看看GpsLocationProvider的构造函数的前面几句:

public GpsLocationProvider(Context context, ILocationManager locationManager) { mContext = context; mLocationManager = locationManager; mNIHandler = new GpsNetInitiatedHandler(context, this); ... } 在GpsLocationProvider类里面的成员变量mLocationManager是构造函数的第二个参数,就是说是LocationManagerService对象。这一点在这里先明确。 接着看_loadProvidersLocked函数。 private void _loadProvidersLocked() { // Attempt to load \ if (GpsLocationProvider.isSupported()) { // Create a gps location provider GpsLocationProvider gpsProvider = new GpsLocationProvider(mContext, this);

mGpsStatusProvider = gpsProvider.getGpsStatusProvider(); mNetInitiatedListener = gpsProvider.getNetInitiatedListener(); addProvider(gpsProvider);

mGpsLocationProvider = gpsProvider; }

// create a passive location provider, which is always enabled PassiveProvider passiveProvider = new PassiveProvider(this); addProvider(passiveProvider);

mEnabledProviders.add(passiveProvider.getName());

// initialize external network location and geocoder services Resources resources = mContext.getResources(); String serviceName = resources.getString(

com.android.internal.R.string.config_networkLocationProvider);

if (serviceName != null) { mNetworkLocationProvider =

new LocationProviderProxy(mContext, LocationManager.NETWORK_PROVIDER,

serviceName, mLocationHandler); addProvider(mNetworkLocationProvider); }

serviceName =

resources.getString(com.android.internal.R.string.config_geocodeProvider);

if (serviceName != null) {

mGeocodeProvider = new GeocoderProxy(mContext, serviceName);

} updateProvidersLocked(); } 在构造完GpsLocationProvider之后将其add到全局变量

ArrayList mProviders中,备以后调用。 在2.2中采取了一种PassiveProvider的类,而在2.1中是通过

LocationProviderProxy代理类的方式。2.1中LocationProviderProxy作为GpsLocationProvider的代理作用在LocationManagerService中,而2.2中的PassiveProvider感觉这个类是个空壳。。。。。。。。有待研究。

然后启动了nerwork location和geocoder 两个service。但是可惜的是这两个服务都无法启动,因为他们是通过配置文件conifg.xml [framework\\base\\core\\res\\res\\values]得到服务的名字,然后启动服务的。但是在这个配置文件中,两个服务的名字都是null。

conifg.xml [framework\\base\\core\\res\\res\\values]

@null @null 其实这也导致了,在调用GetFromLocationName和GetFromLocation两个函数时提示“Service not Available”,这个google Android 2.2的bug。 _loadProvidersLocked函数的最后一句是调用updateProvidersLocked函数,仍然在LocationManagerServic.java文件中。 LocationManagerServic.java

private void updateProvidersLocked() { for (int i = mProviders.size() - 1; i >= 0; i--) { LocationProviderInterface p = mProviders.get(i); boolean isEnabled = p.isEnabled(); String name = p.getName(); boolean shouldBeEnabled = isAllowedBySettingsLocked(name); if (isEnabled && !shouldBeEnabled) { updateProviderListenersLocked(name, false); } else if (!isEnabled && shouldBeEnabled) { updateProviderListenersLocked(name, true); } } } 从上面_loadProvidersLocked函数的代码来看,在mProviders这个ArrayList 中有两个元素(这一点未求证),一个是gpsProvider,另一个是passiveProvider。gpsProvider是 GpsLocationProvider类型的,它的isEnabled函数返回的是false,因为它并没有被enable。而 passiveProvider是PassiveProvider类型,它总是enable的。所以gpsProvider会调用else语句中的updateProviderListenersLocked(name, true)函数。我们主要分析这个else语句,对于passiveProvider不做分析。 private void updateProviderListenersLocked(String provider, boolean enabled) { int listeners = 0; LocationProviderInterface p = mProvidersByName.get(provider); if (p == null) { return; } ArrayList deadReceivers = null; ArrayList records = mRecordsByProvider.get(provider);


Android GPS架构分析.doc 将本文的Word文档下载到电脑
搜索更多关于: Android GPS架构分析 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219