【Android】GPS启动流程及数据流向分析(基于2.3

GPS启动流程及数据流向分析:

首先在系统init阶段,会通过ServiceManager addService添加很多的Service,这其中就包含LocationService。
代码在SystemServer.java中:

[java]

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

随后调用LocationManagerService的systemReady函数开启一个线程。

[java]

final LocationManagerService locationF = location;   try {            if (locationF != null) locationF.systemReady();        } catch (Throwable e) {            reportWtf("making Location Service ready", e);   }  


 --LocationManagerService.java

[java]

void systemReady() {        // we defer starting up the service until the system is ready          Thread thread = new Thread(nullthis"LocationManagerService");        thread.start();   }  

在 Thread的run函数中为接收消息做好了准备,并且调用了一个initialize函数:

[java]

public void run()   {        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);        Looper.prepare();        mLocationHandler = new LocationWorkerHandler();        initialize();        Looper.loop();   }  

接着看initialize():
 

[java]

private void initialize() {             // 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();                // Register for Network (Wifi or Mobile) updates              IntentFilter intentFilter = new IntentFilter();             intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);             // Register for Package Manager updates              intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);             intentFilter.addAction(Intent.ACTION_PACKAGE_RESTARTED);             intentFilter.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);             mContext.registerReceiver(mBroadcastReceiver, intentFilter);            IntentFilter sdFilter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);             mContext.registerReceiver(mBroadcastReceiver, sdFilter);                // listen for settings changes              ContentResolver resolver = mContext.getContentResolver();             Cursor settingsCursor = resolver.query(Settings.Secure.CONTENT_URI, null,                     "(" + Settings.System.NAME + "=?)",                     new String[]{Settings.Secure.LOCATION_PROVIDERS_ALLOWED},                    null);             mSettings = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, mLocationHandler);             SettingsObserver settingsObserver = new SettingsObserver();             mSettings.addObserver(settingsObserver);        }  

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wygxxx.html