Gps學習筆記1


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

}


 

發佈了14 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章