2024年4月16日发(作者:)

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

首先在系统init阶段,会通过ServiceManageraddService添加很多的Service,这其中就

包含LocationService。

代码在中:

try {

Slog.i(TAG, "Location Manager");

location = new LocationManagerService(context);

vice(ON_SERVICE, locati

on);

} catch (Throwable e) {

reportWtf("starting Location Manager", e);

}

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

final LocationManagerService locationF = location;

try {

if (locationF != null) Ready();

} catch (Throwable e) {

reportWtf("making Location Service ready", e);

}

--

void systemReady() {

// we defer starting up the service until the system is ready

Thread thread = new Thread(null, this, "LocationManagerService");

();

}

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

public void run()

{

eadPriority(_PRIORITY_BACKGROUND);

e();

mLocationHandler = new LocationWorkerHandler();

initialize();

();

}

接着看initialize():

private void initialize() {

// Create a wake lock, needs to be done before calling loadProvide

rs() below

PowerManager powerManager = (PowerManager) temServi

ce(_SERVICE);

mWakeLock = eLock(L_WAKE_LOC

K, WAKELOCK_KEY);

// Load providers

loadProviders();

// Register for Network (Wifi or Mobile) updates

IntentFilter intentFilter = new IntentFilter();

ion(TIVITY_ACTION);

// Register for Package Manager updates

ion(_PACKAGE_REMOVED);

ion(_PACKAGE_RESTARTED);

ion(_QUERY_PACKAGE_RESTART);

erReceiver(mBroadcastReceiver, intentFilter);

IntentFilter sdFilter = new IntentFilter(_EXTERNAL_APP

LICATIONS_UNAVAILABLE);

erReceiver(mBroadcastReceiver, sdFilter);

// listen for settings changes

ContentResolver resolver = tentResolver();

Cursor settingsCursor = (T_URI

, null,

"(" + + "=?)",

new String[]{ON_PROVIDERS_ALLOWED},

null);

mSettings = new ContentQueryMap(settingsCursor,

ME, true, mLocationHandler);

SettingsObserver settingsObserver = new SettingsObserver();

erver(settingsObserver);

}

其中有两个重要的地方:

1)loadProviders(),会new一个GpsLocationProvider,并将本GpsLocationProvider

添加一个ArrayList的链 表中。

2) new 一个SettingsObserver对象,该对象应该是负责在Settings中有数据变化时

通知本地程序进行相应处理的功能。其中SettingsObserver类中实现 了Observer接口,

该接口中的update函数应该就是一个回调函数,当Settings中有数据变化时会回调进这

个函数:

private final class SettingsObserver implements Observer {

public void update(Observable o, Object arg) {