下面这个就是定位服务的基本框架:
首先在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:写的比较简单,比较乱,这需要借着源码来看会比较清楚。