關於wifi的連接部分,這裡分了三個步驟:
1.開啟WiFi
·用戶在設置界面開啟WiFi,調用Settings應用程序的WifiEnabler.setWifiEnabled,然後調用WifiManager.setWifiEnabled。
·WifiManager.setWifiEnabled通過Binder機制調用WifiService.setWifiEnabled。這裡的WifiService也就是WiFi的Java層的內容。
·WifiService.setWifiEnabled將MESSAGE_ENABLE_WIFI消息發送到自己的消息隊列。
·WifiService通過WifiHandler的handleMessage處理MESSAGE_ENABLE_WIFI,調用setWifiEnabledBlocking。setWifiEnabledBlocking調用setWifiEnabledState,向外發出WIFI_STATE_CHANGED_ACTION通知消息。另外,它還完成一些初始工作,如設置當前狀態、加載WiFi驅動、開啟wpa_supplicant、開啟WifiStateTracker、注冊BroadcastReceiver監視WifiStateTracker的消息等。這些內容在WifiService.java中。
·由於WifiEnabler初始化時注冊了BroadcastReceiver,因此它會獲得這個通知消息,進入handleWifiStateChanged處理一些內部狀態以及顯示。
·WifiLayer也同樣獲得了這個通知消息,至此,WiFi開啟完成。
2.查找AP
WiFi查找AP的過程如下:
·Settings應用程序的WifiLayer.attemptScan調用WifiManager.startScan。
·Settings應用程序的WifiManager.startScan通過Binder機制調用WifiService.startScan。
·WiFi服務層的WifiServiceWifiNative.scanCommand通過WifiNative發送掃描命令給wpa_command來完成這一發送過程。至此,命令發送成功。
·命令的最終響應由wpa_supplicant上報“SCAN-RESULTS”消息,WifiStateTracker開啟的WifiMonitor的MonitorThread可以獲取次消息並交由handleEvent處理。
·handleEvent的處理方式是調用WifiStateTracker.notifyScanResultsAvailable。
·在WifiStateTracker中,通過EVENT_SCAN_RESULTS_AVAILABLE完成消息傳遞,調用sendScanResultsAvailable將SCAN_RESULTS_AVAILABLE_ACTION通知消息廣播出去。
·WifiLayer會最終獲得這個通知消息,調用handleScanResultsAvailable繼續處理。次函數會根據返回的AP數據建立對應的處理結構,並完成對應界面的繪制,以供用戶操作AP列表。至此,AP查找完成,也完成了一次典型的自上而下、再自下而上的情景。
3.連接AP
WiFi連接AP的步驟如下:
·單擊AP列表的某個項目後,會彈出AccessPointDialog對話框,單擊“連接”按鈕,將handleConnect轉化為到WifiLayer.connectToNetwork的調用。
·在connectToNetwork中完成一些查找和配置,再通過managerEnableNetwork調用WifiManager.enableNetwork。
·連接的中間流程與查找AP的流程類似,都經過了WifiMonitor對“CONNECTED”消息響應的捕獲,以及WifiStateTracker對EVENT_SUPPLICANT_STATE_CHANGED的處理。還有一個比較重要的步驟是WifiStateTracker通過對DHCP服務器的申請進行了IP地址分配。最終會廣播NETWORK_STATE_CHANGED_ACTION消息,有WifiLayer響應。