原文地址: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不做分析。

更多相关文章

  1. Android Studio 2.0下创建jni应用调用本地C函数
  2. Android Studio学习:简单控件:Button控件的点击、长按函数重写
  3. Android 判断两个图片相等
  4. 实现两个Spinner互相关联
  5. Android 打印函数调用堆栈调试
  6. Sql语句在Android的用法

随机推荐

  1. Android跳转到应用商店及常见APP对应包名
  2. ubuntu下搭建ecshop
  3. Android(安卓)读取资源文件下面的文件
  4. Android(安卓)网络提交数据(使用Asynchron
  5. android 系统相应的服务
  6. Android(安卓)接口和抽象类的区别
  7. android中AlertDialog设置圆角
  8. android sdk sdkmanger无界面使用方法(命
  9. Android系统应用框架篇:Activity启动流程(
  10. Android(安卓)命名规范和编码规范