Android GPS 架构学习笔记

                        Android GPS 架构学习笔记 (基于高通MSM8926代码)

学习GPS模块时候,你脑海中首先应该有个GPS的基本框架结构,从application到framework到JNI再到HAL层。

下面这个就是定位服务的基本框架:

Android GPS 架构学习笔记_第1张图片



接下来就大致的从最上层开始,解析GPS的一些基本工作原理。

1.Settings
      我们打开GPS应用的时候一般会先打开设置中定位服务的GPS开关,这是我们的第一步,让我们看看之后会android是如何开启定位服务的。

    首先在locationsettings.java  中,当GPS开关打开时候:Settings.Secure.setLocationProviderEnabled(cr,LocationManager.GPS_PROVIDER, gpsenabled);

   
    LocationManagerService.java 中,当手机开机时候,系统起来后,在systemReady()函数中会去监听Settings中的状态变化。

(1)loadProvidersLocked():

    GpsLocationProvider gpsProvider = new GpsLocationProvider(mContext, this,
                mLocationHandler.getLooper());

            if (GpsLocationProvider.isSupported()) {
            mGpsStatusProvider = gpsProvider.getGpsStatusProvider();
            mNetInitiatedListener = gpsProvider.getNetInitiatedListener();
            addProviderLocked(gpsProvider);
            mRealProviders.put(LocationManager.GPS_PROVIDER, gpsProvider);
        }


(2)updateProvidersLocked:

        private void updateProvidersLocked() {
        boolean changesMade = false;
        for (int i = mProviders.size() - 1; i >= 0; i--) {
            LocationProviderInterface p = mProviders.get(i);
            boolean isEnabled = p.isEnabled();
            String name = p.getName();
            boolean shouldBeEnabled = isAllowedByCurrentUserSettingsLocked(name);
            if (isEnabled && !shouldBeEnabled) {
                updateProviderListenersLocked(name, false, mCurrentUserId);
                changesMade = true;
            } else if (!isEnabled && shouldBeEnabled) {
                updateProviderListenersLocked(name, true, mCurrentUserId);
                changesMade = true;
            }
        }
        if (changesMade) {
            mContext.sendBroadcastAsUser(new Intent(LocationManager.PROVIDERS_CHANGED_ACTION),
                    UserHandle.ALL);
        }
    }


(3)private void updateProviderListenersLocked(String provider, boolean enabled, int userId)


    关键就是这个函数,看:

        LocationProviderInterface p = mProvidersByName.get(provider);

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


再来跟踪看看gpslocationprovider.java 中,enable()函数到底做了什么?

(1)它发了一个消息:        sendMessage(ENABLE, 1, null);

继而执行handleEnable();       

boolean enabled = native_init(); 

没错,就是这个函数 native_init(),它就是GPS真正工作的开始,进行了一系列初始化工作。

这里对 native_init()就不进行分析,涉及到native函数和JNI层,后续会花时间重点来讲这一块。

当关闭GPS时候执行的操作:

 (2) @Override
    public void disable() {
        synchronized (mLock) {
            if (!mEnabled) return;
            mEnabled = false;
        }

        sendMessage(ENABLE, 0, null);
    }

    private void handleDisable() {
        if (DEBUG) Log.d(TAG, "handleDisable");

        stopNavigating();
        mAlarmManager.cancel(mWakeupIntent);
        mAlarmManager.cancel(mTimeoutIntent);

        // do this before releasing wakelock
        native_cleanup();
    }



这就是从应用从打开GPS到framework层,GPS开始工作的流程,后续会对JNI层还有HAL层进行分析,以及数据上报的回调函数等。


PS:写的比较简单,比较乱,这需要借着源码来看会比较清楚。





你可能感兴趣的:(Android GPS 架构学习笔记)