Android Gps模块总结
App层如何使用定位
public void startLocation(Context mContext) {
locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
//发起定位
locationManager.requestLocationUpdates("gps", 1000, 0, MyLocationListener);
}
源码时序图
总结一下: locationManager.requestLocationUpdates -------------》GnssLocationProvider.native_start()
当我们调用requestLocationUpdates的时候 其实最终是调到了GnssLocationProvider.native_start()中的jni方法,所以我们要关注GnssLocationProvider是什么时候创建的
1. Android什么时候建立启动LocationManagerService模块
Android系统启动的时候
SystemServer.java
private void startOtherServices() {
。。。。省略代码
traceBeginAndSlog("StartLocationManagerService");
try {
//创建LMS服务
location = new LocationManagerService(context);
ServiceManager.addService(Context.LOCATION_SERVICE, location);
} catch (Throwable e) {
reportWtf("starting Location Manager", e);
}
traceEnd();
。。。。省略代码
final LocationManagerService locationF = location;
。。。。省略代码
try {
if (locationF != null) locationF.systemRunning();
} catch (Throwable e) {
reportWtf("Notifying Location Service running", e);
}
}
LocationManagerService.java
public void systemRunning() {
。。。。省略代码
// prepare providers
loadProvidersLocked();
}
private void loadProvidersLocked() {
。。。。省略代码
if (GnssLocationProvider.isSupported()) {
// Create a gps location provider
LocationProvider gnssProviderManager = new LocationProvider(GPS_PROVIDER, true);
mRealProviders.add(gnssProviderManager);
addProviderLocked(gnssProviderManager);
//这里可以看到GnssLocationProvider建立了
GnssLocationProvider gnssProvider = new GnssLocationProvider(mContext,
gnssProviderManager,
mHandler.getLooper());
gnssProviderManager.attachLocked(gnssProvider);
}