原文地址:http://hi.baidu.com/%CB%EF%CC%EF%BB%AA/blog/item/3a21a25488a5a7491138c22b.html

initialize函数

LocationManagerService.java[frameworks/base/services/java/com/android/server]

privatevoidinitialize(){
// Create a wake lock, needs to be done before calling loadProviders() below
PowerManager powerManager=(PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
mWakeLock=powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,WAKELOCK_KEY);
// Load providers
loadProviders();

...

initialize函数中最重要的就是loadProviders函数了,该函数调用loadProvidersLocked,然后loadProvidersLocked函数又调用_loadProvidersLocked函数。为什么要这么折腾呢?

先来看一部分的_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;
}

...

注意这个if语句,狠重要,因为在这个语句中得到了HAL层的GPS接口GpsInterface。就是通过调用GpsLocationProviderisSupported()函数才调用到gps.cpp[hardware/libhardware_legacy/gps]中的gps_get_interface()。这个isSupported函数才是第一个吃螃蟹的人。(而不是JNI层的init函数,这个下面会提到)。

GpsLocationProvider.cpp[frameworks/base/location/java/com/android/internal/location]

publicstaticboolean isSupported(){
returnnative_is_supported();
}


然而isSupported只有一句话,果然是高手,一击必中。然后就调用native方法,也就是JNI层定义的方法。native_is_supported函数对于JNI层是android_location_GpsLocationProvider_is_supported方法。

android_location_GpsLocationProvider.cpp [frameworks/base/core/jni]

staticjboolean android_location_GpsLocationProvider_is_supported(JNIEnv*env,jclass clazz){
if(!sGpsInterface)
sGpsInterface=gps_get_interface();
return(sGpsInterface!=NULL);
}

前面已经提到JNI起到承上启下的作用,gps_get_interface函数属于HAL层的调用,在文件gps.cpp中。

gps.cpp [hardware/libhardware_legacy/gps]

constGpsInterface*
gps_get_interface()
{
if(sGpsInterface==NULL)
gps_find_hardware();
returnsGpsInterface;
}

然后通过 gps_find_hardware函数去得到gps接口,下面只模拟器中的gpsinterface。

staticvoid
gps_find_hardware(void)
{
#ifdefHAVE_QEMU_GPS_HARDWARE
if(qemu_check()){
sGpsInterface=gps_get_qemu_interface();
if(sGpsInterface){
LOGD("using QEMU GPS Hardware emulation/n");
return;
}
}
#endif
#ifdefHAVE_GPS_HARDWARE
sGpsInterface=gps_get_hardware_interface();
#endif
if(!sGpsInterface)
LOGD("no GPS hardware on this device/n");
}

gps_qemu.c [hardware/libhardware_legacy/gps]

constGpsInterface*gps_get_qemu_interface()
{
return&qemuGpsInterface;
}

qemuGpsInterface的整体实现就在文件gps_qemu.c中。

staticconstGpsInterface qemuGpsInterface={
qemu_gps_init,
qemu_gps_start,
qemu_gps_stop,
qemu_gps_cleanup,
qemu_gps_inject_time,
qemu_gps_inject_location,
qemu_gps_delete_aiding_data,
qemu_gps_set_position_mode,
qemu_gps_get_extension,
};


更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. 箭头函数的基础使用
  3. Python技巧匿名函数、回调函数和高阶函数
  4. Python list sort方法的具体使用
  5. python list.sort()根据多个关键字排序的方法实现
  6. Android架构分析之硬件抽象层(HAL)
  7. Android在子线程中更新UI的方法汇总(共七种)
  8. Android应用程序获取ROOT权限的方法 (基础篇)
  9. Android(安卓)关闭(删除)FM Transmitter功能的方法

随机推荐

  1. Android自动弹出软键盘
  2. BIOS中开启虚拟化技术
  3. Android 双击返回键退出功能的实现
  4. java.lang.NoSuchFieldError: com.banwxf
  5. Android 自定义Toast,不使用系统Toast
  6. Cocos Creator与Android(安卓)接口互调
  7. Android OKHttp3 超时设置和异常捕获
  8. Android 用ScrollView和HorizontalScroll
  9. Android 设置字体大小和显示大小后界面混
  10. Android Bitmap 与 Drawable之间的转换