随时扫描功能:在wifi关闭的时候,底层并没有真正意义上的关闭,而是继续扫描,只是不再列表上显示罢了。
现在分析随时扫描功能开启后wifi打开、关闭、显示扫描结果的流程。在这里需要关注两个状态机:WifiController、WifiStateMachine。
这两个状态机都是在wifiservice中创建的,当第一次打开wifi之前,两个状态机的状态为:WifiStateMachine(ScanModeState)、WifiController(StaDisabledWithScanState)
在WifiController中会做如下操作:
mWifiStateMachine.setSupplicantRunning(true);
mWifiStateMachine.setOperationalMode(WifiStateMachine.SCAN_ONLY_WITH_WIFI_OFF_MODE);
mWifiStateMachine.setDriverStart(true);
WifiStateMachine 在接收到 CMD_START_SUPPLICANT命令后,会去做打开连接wpa_supplicant的操作,并跳转到SupplicantStartingState状态,接收到 SUP_CONNECTION_EVENT事件,处理完成后跳转到 DriverStartedState,最后会跳转到 DisconnectedState状态(mOperationalMode 初始为 CONNECT_MODE)
接下来setOperationalMode在DisconnectedState中处理,最后会跳转到ScanModeState状态。
当打开wifi时正确的处理流程是这样的: