Android GPS学习笔记(二)--架构及其初始化流程

1.GPS架构

        

                                                    定位服务架构

    如上图所示:

    定位服务共分为四层:

    最上面是应用层,以java为主。

    第二层是框架层,这一层包含了供应用调用的接口及其系统服务的实现,主要由 Java 语言来实现。

    第三层是硬件抽象层,本层由 C 以及 C++ 语言实现 , 框架层与共享库层使用 JNI 进行衔接。

    最下面一层是 Linux 内核层 , 整个 Android 系统都是以 Linux 内核为基础的

    FW-->HW之间的通信,对于android8.0以上的版本来说稍微复杂一下。android8.0以上的版本加入HIDL,JNI会通过HIDL来间接调和HW进行通信。

2.GPS初始化流程

1.在SystemServer.java中添加定位服务并通过systemrunning开启

try {
                    location = new LocationManagerService(context);
                    ServiceManager.addService(Context.LOCATION_SERVICE, location);
                } catch (Throwable e) {
                    reportWtf("starting Location Manager", e);
                }

----------------------------------------------
try {
                if (locationF != null) locationF.systemRunning();
            } catch (Throwable e) {
                reportWtf("Notifying Location Service running", e);
            }

2.LocationManagerService.systemRunning  //prepare providers

 // prepare providers
            loadProvidersLocked();
            updateProvidersLocked();

3.loadProvidersLocked     //加载GnssLocationProvider

这里只针对GPS,所以只贴了GNSS的相关代码。其实加载的供应者还有passive,fuse,network相关的provider,请自行分析。

        if (GnssLocationProvider.isSupported() && !WCN_DISABLED && HAS_GPS_FEATURE) {
            // Create a gps location provider
            GnssLocationProvider gnssProvider = new GnssLocationProvider(mContext, this,
                    mLocationHandler.getLooper());
            mGnssSystemInfoProvider = gnssProvider.getGnssSystemInfoProvider();
            mGnssBatchingProvider = gnssProvider.getGnssBatchingProvider();
            mGnssMetricsProvider = gnssProvider.getGnssMetricsProvider();
            mGnssStatusProvider = gnssProvider.getGnssStatusProvider();
            mNetInitiatedListener = gnssProvider.getNetInitiatedListener();
            addProviderLocked(gnssProvider);
            mRealProviders.put(LocationManager.GPS_PROVIDER, gnssProvider);
            mGnssMeasurementsProvider = gnssProvider.getGnssMeasurementsProvider();
            mGnssNavigationMessageProvider = gnssProvider.getGnssNavigationMessageProvider();
            mGpsGeofenceProxy = gnssProvider.getGpsGeofenceProxy();
        } else {
            if (D) Log.d(TAG, "gnss location provider not support !");
        }

4.加载之前首先要判断是否支持GNSS,其实在调用isSupproted之前,Gnss对providers做初始化工作,即图中的class_init_naitve。若是支持的话,isSupported肯定返回的是true,然后建立GnssLocationProvider对象,并加入链表记录下来。

5.updateProvidersLocked--》updateProviderListenersLocked

 if (enabled) {
            p.enable();
            if (listeners > 0) {
                applyRequirementsLocked(provider);
            }
        } else {
            p.disable();
        }

该步骤的功能会根据相应的provider的开启状态进行关闭或开启。例如,若Gnss未开启,则会执行p.enable()开启Gnss。

至于GPS定位功能的使用,其实更简单了,这里只做一些简单的说明。

1.获取Location服务

2.判断是否支持GPS定位

3.若支持,则requestLocationUpdates请求定位更新





  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞_哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值