在wifi啓動掃描的分析過程當中,出現了屢次WifiMonitor的操做,在此分析一下這個函數是如何工做的。
在Android的Wifi體系中,WifiMonitor承擔着分發來自wpa_supplicant底層事件的任務。當上層下達Wifi的掃描、鏈接等指令後, 底層驅動以及wpa_s進行實際的掃描、鏈接操做,操做完成後會向上層反饋一個event,通知framework掃描是否結束、鏈接是否成功。
1.WifiMonitor的初始化
在WifiStateMachine的構造函數中獲取WifiMonitor的實例,而且在WifiStateMachine的構造函數中註冊了一系列的handler。app
從啓動掃描流程中可知,在啓動過程當中會調用startMonitoring(),開始監遵從底層上報的消息。函數
2.startMonitoring()this
爲了監聽wpa_supplicant的事件,須要先創建與wpa_s的消息通道,這一步調用WifiNative.connectToSupplicant()實現。
若是是第一次進行監聽mConnected爲false,進入else分支。先創建與wpa_s的消息通道,創建成功後會向WifiStateMachine發送SUP_CONNECTION_EVENT消息,通知Wifi狀態機。隨後,開啓事件監聽線程:new MonitorThread(mWifiNative, this).start():線程
這裏咱們假設事先下發的是一個wifi掃描的指令,wpa_s反饋event通知wifi掃描的結果,根據實現的一些匹配規則,最後進入handleEvent()函數,此處event是SCAN_RESULTS,向WifiStateMachine發送SCAN_RESULTS_EVENT消息,告知它掃描已經結束,能夠去讀取掃描結果了。這樣,處理流程就用返回到Wifi狀態機中。WifiStateMachine收到此消息後,調用WifiStateMachine::setScanResults()方法從wpa_s讀取掃描結果,並向外界發送WifiManager.SCAN_RESULTS_AVAILABLE_ACTION廣播通知應用。此時一些註冊過該廣播的應用,例如手機中的Setting app,就能經過調用WifiManager::getScanResults()讀取掃描結果了。至此,一個簡單的WifiMonitor分發事件的流程結束,其餘類型事件的分發跟此過程類似。3d
至此,一個簡單的上層流程分析結束了。
---------------------
blog