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);
}