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
}