原文地址:http://hi.baidu.com/%CB%EF%CC%EF%BB%AA/blog/item/3a21a25488a5a7491138c22b.html
-------------------------------------------------------------------------------- 在底层得到gps的接口之后,if (GpsLocationProvider.isSupported())(在文件LocationManagerService.java中调用)语句得到true,然后进行下一步操作,在这里new了一个GpsLocationProvider对象。代码如下:
GpsLocationProvider gpsProvider=newGpsLocationProvider(mContext,this); |
注意GpsLocationProvider构造函数里面的两个参数:mContext, this。下面来看看GpsLocationProvider的构造函数的前面几句:
publicGpsLocationProvider(Context context,ILocationManager locationManager){ mContext=context; mLocationManager=locationManager; mNIHandler=newGpsNetInitiatedHandler(context,this); ... } |
在GpsLocationProvider类里面的成员变量mLocationManager是构造函数的第二个参数,就是说是LocationManagerService对象。这一点在这里先明确。
接着看_loadProvidersLocked函数。
privatevoid_loadProvidersLocked(){ // Attempt to load "real" providers first if(GpsLocationProvider.isSupported()){ // Create a gps location provider GpsLocationProvider gpsProvider=newGpsLocationProvider(mContext,this); mGpsStatusProvider=gpsProvider.getGpsStatusProvider(); mNetInitiatedListener=gpsProvider.getNetInitiatedListener(); addProvider(gpsProvider); mGpsLocationProvider=gpsProvider; } // create a passive location provider, which is always enabled PassiveProvider passiveProvider=newPassiveProvider(this); addProvider(passiveProvider); mEnabledProviders.add(passiveProvider.getName()); // initialize external network location and geocoder services Resources resources=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到全局变量ArrayList<LocationProviderInterface> 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]
<!--Componentnameofthe service providing network location support.--> <stringname="config_networkLocationProvider">@null</string> <!--Componentnameofthe service providing geocoder API support.--> <stringname="config_geocodeProvider">@null</string> |
其实这也导致了,在调用GetFromLocationName和GetFromLocation两个函数时提示“Service not Available”,这个google Android 2.2的bug。
_loadProvidersLocked函数的最后一句是调用updateProvidersLocked函数,仍然在LocationManagerServic.java文件中。
LocationManagerServic.java
privatevoidupdateProvidersLocked(){ for(inti=mProviders.size()-1;i>=0;i--){ LocationProviderInterface p=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不做分析。
- Android Studio 2.0下创建jni应用调用本地C函数
- Android Studio学习:简单控件:Button控件的点击、长按函数重写
- Android 判断两个图片相等
- 实现两个Spinner互相关联
- Android 打印函数调用堆栈调试
- Sql语句在Android的用法
随机推荐
-
Android跳转到应用商店及常见APP对应包名
-
ubuntu下搭建ecshop
-
Android(安卓)读取资源文件下面的文件
-
Android(安卓)网络提交数据(使用Asynchron
-
android 系统相应的服务
-
Android(安卓)接口和抽象类的区别
-
android中AlertDialog设置圆角
-
android sdk sdkmanger无界面使用方法(命
-
Android系统应用框架篇:Activity启动流程(
-
Android(安卓)命名规范和编码规范