1. 系统启动 SystemServer ,接着 SystemServer 创建 LocationManagerService. 并调用其 SystemReady ();
2. 在 SystemReady ()中, service 启动了一个线程,做了一些初始化( Handler,Intent,Observer ) , 主要是 loadProviders(), 该函数加载了可用的 location 接口,主要是三类, GpsLocationProvider , PassiveProvider , LocationProviderProxy 。
三类都是 LocationProviderInterface 的子类。
最后 updateProvidersLocked() 函数,根据属性打开或关闭相关的 location 接口(主要函数 enable() , enableLocationTracking( state );disable() ),如有改变,则发送 Intent(LocationManager.PROVIDERS_CHANGED_ACTION ) 。
备注:
(1). 当 enable 的时候,会判断当前 listener 的个数,如个数大于 0 ,则 enableLocationTracking ( true )。
(2).enable 的主要工作:
a.native_init() 主要获取 gps 接口,调用 interface->init ( &cb )注册 callback 函数 , 创建监听线程并进入监听状态( pthread_create( &state->thread, NULL, gps_state_thread, state ) )。
当接受到 CMD_START 命令时候开始回调:
回调过程 state->callbacks.location_cb---->
location_callback(jni)-->reportLocation(java)-->Handler.sendMessage(MESSAGE_LOCATION_CHANGED )--->p.updateLocation(location);
b. 初始化扩展接口和 agps ,函数为 native_supports_xtra() 和 native_set_agps_server ( ... )
(3). enableLocationTracking (state) 主要通过 startNavigating( false ) 和 stopNavigating() 来实现。
start Navigating(false){
native_set_position_mode()-->interface->set_position_mode();
native_start()-->interface->start()-->send CMD_START
}
private void stopNavigating() {
native_stop() -->interface->stop()--> -->send CMD_STOP
}