您的位置:首页 > 运维架构 > 网站架构

Android GPS 架构学习笔记

2014-07-11 17:29 686 查看
                        Android GPS 架构学习笔记 (基于高通MSM8926代码)

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

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



接下来就大致的从最上层开始,解析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:写的比较简单,比较乱,这需要借着源码来看会比较清楚。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息