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:写的比较简单,比较乱,这需要借着源码来看会比较清楚。
学习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:写的比较简单,比较乱,这需要借着源码来看会比较清楚。
相关文章推荐
- Android GPS学习笔记—系统架构
- Android GPS学习笔记(1)—系统架构
- Android 学习笔记 —— Android 四大组件 与 MVC 架构模式
- android 显示架构学习笔记
- Android GPS学习笔记(5)—LMS初始化
- 《Android群英传》学习笔记 ---Android系统架构
- android 入门学习笔记 取得文件架构、打开文件、判断文件MimeType 的方法
- Android第一行代码学习笔记一----android架构
- Android GPS学习笔记(4)—HAL实现
- 学习笔记:Android系统架构
- Android GPS学习笔记(6)—GpsLP初始化
- android底层架构学习笔记
- Android GPS学习笔记(3)—JNI层实现
- Android 学习笔记1:基本架构
- Android GPS学习笔记—重要结构体及接口
- Android系统架构学习笔记
- Android系统架构(简述)——《深入理解(I)》学习笔记1
- API Demos 2.3 学习笔记 (1)-- Android应用程序架构
- Android开发学习笔记一选择架构工具
- Android GPS学习笔记—JNI层实现