1 WifiConnectivityManager
WifiConnectivityManager,之前Android connect一個wifi和做scan的操作都是放在wifistatemachine中的,整個看起來很雜亂。現在google在android N中做了個新的東西,WifiConnectivityManager,通過這個東西來管理scan和connect。這裡我從wifi connect一個ssid的流程來看這個WifiConnectivityManager.
2 WifiManager.connect()
這個API沒有發生變動.
在WifiserviceImpl.Java中會收到這個CMD,跟着做相應的處理
看下WifiStateMachine,一般都是在ConnectModeState中會處理這個
連接配接一個使用者指定的SSID
WifiQualifiedNetworkSelector
其實這個class的設計是用于自動連接配接一個信号比較好的wifi ssid的。把使用者連接配接一個熱點的邏輯整合在這裡,應該是為了避免在android 5.1經常出現的使用者觸發一個連接配接熱點的操作,結果背景auto connect自己選擇一個熱點也去連接配接了,結果兩個flow打架
2.1 看下①處的userSelectNetwork
到這裡的就結束了。。。。。這部分邏輯應該是為防止attempt auto join去跑的邏輯。
回到前面的WiFiConnectivityManager中,
2.2 跑完①之後,跟着會跑②
回到前面的WifiStatemachine中,跟着後面直接call mWifiNative.reconnect()去連接配接一個SSID。
3 Auto connect
Android N對這個auto connect的部分做了大改,重新做了。這個Auto connect的機制其實是為了做wifi 熱點的漫遊用,即當找到信号等品質更好的熱點的時候,就會切過去。但是在之前,特别是android L這個部分和使用者connect的flow産生沖突,出現了很多的bug,很雞肋。
前面提到的新 Android N scan機制 提到了幾種scan場景的應用,這個auto connect都會用到。這裡我們就隻分析一種case就好。
startPeriodicScan,這個是當螢幕是亮屏的時候,背景一直做scan的操作。
看下這裡傳入的監聽器:mPeriodicScanListener
看下這些函數都做了些什麼?
3.1 selectQualifiedNetwork
3.2 connectToNetwork
對我們通過算法算出來的目标ssid發起連接配接,candidate是一個WifiConfiguration對象。
接下來就交給Wifistatemachine去處理了。
/**
* Automatically connect to the network specified
*
* @param networkId ID of the network to connect to
* @param bssid BSSID of the network
*/
public void autoConnectToNetwork(int networkId, String bssid) {
sendMessage(CMD_AUTO_CONNECT, networkId, , bssid);
}
/**
* Automatically roam to the network specified
*
* @param networkId ID of the network to roam to
* @param scanResult scan result which identifies the network to roam to
*/
public void autoRoamToNetwork(int networkId, ScanResult scanResult) {
sendMessage(CMD_AUTO_ROAM, networkId, , scanResult);
}