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) {


发布评论