Android GPS架构分析

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

AndroidGPS架构分析DanielWood20101222转载时请注明出处和作者文章出处:作者:DanielWood--------------------------------------------------------------------------------在底层得到gps的接口之后,if(GpsLocationProvider.isSupported())(在文件LocationManagerService.java中调用)语句得到true,然后进行下一步操作,在这里new了一个GpsLocationProvider对象。代码如下:GpsLocationProvidergpsProvider=newGpsLocationProvider(mContext,this);注意GpsLocationProvider构造函数里面的两个参数:mContext,this。下面来看看GpsLocationProvider的构造函数的前面几句:publicGpsLocationProvider(Contextcontext,ILocationManagerlocationManager){mContext=context;mLocationManager=locationManager;mNIHandler=newGpsNetInitiatedHandler(context,this);...}在GpsLocationProvider类里面的成员变量mLocationManager是构造函数的第二个参数,就是说是LocationManagerService对象。这一点在这里先明确。接着看_loadProvidersLocked函数。privatevoid_loadProvidersLocked(){//Attempttoloadrealprovidersfirstif(GpsLocationProvider.isSupported()){//CreateagpslocationproviderGpsLocationProvidergpsProvider=newGpsLocationProvider(mContext,this);mGpsStatusProvider=gpsProvider.getGpsStatusProvider();mNetInitiatedListener=gpsProvider.getNetInitiatedListener();addProvider(gpsProvider);mGpsLocationProvider=gpsProvider;}//createapassivelocationprovider,whichisalwaysenabledPassiveProviderpassiveProvider=newPassiveProvider(this);addProvider(passiveProvider);mEnabledProviders.add(passiveProvider.getName());//initializeexternalnetworklocationandgeocoderservicesResourcesresources=mContext.getResources();StringserviceName=resources.getString(com.android.internal.R.string.config_networkLocationProvider);if(serviceName!=null){mNetworkLocationProvider=newLocationProviderProxy(mContext,LocationManager.NETWORK_PROVIDER,serviceName,mLocationHandler);addProvider(mNetworkLocationProvider);}serviceName=resources.getString(com.android.internal.R.string.config_geocodeProvider);if(serviceName!=null){mGeocodeProvider=newGeocoderProxy(mContext,serviceName);}updateProvidersLocked();}在构造完GpsLocationProvider之后将其add到全局变量ArrayListLocationProviderInterfacemProviders中,备以后调用。在2.2中采取了一种PassiveProvider的类,而在2.1中是通过LocationProviderProxy代理类的方式。2.1中LocationProviderProxy作为GpsLocationProvider的代理作用在LocationManagerService中,而2.2中的PassiveProvider感觉这个类是个空壳。。。。。。。。有待研究。然后启动了nerworklocation和geocoder两个service。但是可惜的是这两个服务都无法启动,因为他们是通过配置文件conifg.xml[framework\base\core\res\res\values]得到服务的名字,然后启动服务的。但是在这个配置文件中,两个服务的名字都是null。conifg.xml[framework\base\core\res\res\values]!--Componentnameoftheserviceprovidingnetworklocationsupport.--stringname=config_networkLocationProvider@null/string!--ComponentnameoftheserviceprovidinggeocoderAPIsupport.--stringname=config_geocodeProvider@null/string其实这也导致了,在调用GetFromLocationName和GetFromLocation两个函数时提示“ServicenotAvailable”,这个googleAndroid2.2的bug。_loadProvidersLocked函数的最后一句是调用updateProvidersLocked函数,仍然在LocationManagerServic.java文件中。LocationManagerServic.javaprivatevoidupdateProvidersLocked(){for(inti=mProviders.size()-1;i=0;i--){LocationProviderInterfacep=mProviders.get(i);booleanisEnabled=p.isEnabled();Stringname=p.getName();booleanshouldBeEnabled=isAllowedBySettingsLocked(name);if(isEnabled&&!shouldBeEnabled){updateProviderListenersLocked(name,false);}elseif(!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不做分析。privatevoidupdateProviderListenersLocked(Stringprovider,booleanenabled){intlisteners=0;LocationProviderInterfacep=mProvidersByName.get(provider);if(p==null){return;}ArrayListReceiverdeadReceivers=null;ArrayListUpdateRecordrecords=mRecordsByProvider.get(provider);if(records!=null){finalintN=records.size();for(inti=0;iN;i++){UpdateRecordrecord=records.get(i);//Sendsanotificationmessagetothereceiverif(!record.mReceiver.callProviderEnabledLocked(provider,enabled)){if(deadReceivers==null){deadReceivers=newArrayListReceiver();}deadReceivers.add(record.mReceiver);}listeners++;}}if(deadReceivers!=null){for(inti=deadReceivers.size()-1;i=0;i--){removeUpdatesLocked(deadReceivers.get(i));}}if(enabled){//enabled的值是truep.enable();if(listeners0){p.setMinTime(getMinTimeLocked(provider));p.enableLocationTracking(true);}}else{p.enableLocationTracking(false);p.disable();}}我们只关注主体部分代码,就是在if(enabled)这个语句段里面,启动了gps的服务,具体将在下一篇进行分析。Android编程之实现GPS定位(1)2008-03-1210:12佚名中国IT实验室我要评论(0)字号:T|T本文帮助读者理解如何使用AndroidSDK来开发Android程序,其中包括如何使用XML布局来显示关系,从GPS组件中获得设备的位置等,在本文的最后将学习如何将文本显示在一个定制的视图上。AD:在几个月前,开发式手机联盟推出自己的Android手机雏形时,受到了极大的追捧。但是到现在还没有真机在市场上销售,Google为了鼓励开发人员来开发Android手机的应用程序,提供了1千万美金来奖励那些在Android开发中的获奖者。当然,本文并不是告诉读者如何去赢得大奖,而是帮助读者理解如何使用AndroidSDK来开发Android程序,其中包括如何使用XML布局来显示关系,从GPS组件中获得设备的位置等,在本文的最后将学习如何将文本显示在一个定制的视图上。一、准备工作要想开发Android程序,我们需要如下三种软件:1、Eclipse2、AndroidSDK3、开发Android程序的Eclipse插件为了开始我们的工作,首先要安装Eclipse,然后从Google的网站获得AndroidSDK,并且安装Eclipse插件。二、Activity类每一种移动开发环境都有自己的基类。

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功