文章目录
-
- 流程框架图
- 代码流程
-
- 1. ClientModeManager.ClientModeStateMachine
- 2. WifiTracker.BroadcastReceiver --> wifiManager.StartScan
- 3. wifiManager.StartScan --> WifiServiceImpl --> ScanRequestProxy.StartScan
- 4. WifiScanner.startScan --> WifiScaningServiceImpl.ClientHandler.handleMessage
- 5. WifiScanner.startScan --> WifiScaningServiceImpl.ClientHandler.handleMessage
- 6. WifiScaningServiceImpl.tryToStartNewScan -- WifiNative.scan
- 7. WifiNative.scan --> WificondControl
- 8. 扫描结果回传
流程框架图
通常,我们在设备开启Wifi之后,等会儿自动扫描出周围的热点,
注意此时我们并没有点击扫描键,只是点击了一下wifi 开关就可以完成两件事情(1. 开启wifi,2. 扫描周围热点),
问题,第二点是如何实现的呢?
请详看本文 ~~
- 这里先参考Android P Wifi Enable 流程
- 有上一步,本文就容易理解
- 先上一张流程图
代码流程
以下的代码流程,在Android P WiFi Enable 流程基础上往下继续
1. ClientModeManager.ClientModeStateMachine
- ClientModeStateMachine 由CMD_START 转换到StartedState
- StartedState 状态机,在更新wifiState时,发送广播 WifiManager.WIFI_STATE_CHANGED_ACTION , 通知WifiTracker 开始进行Scan
frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeManager.java
public boolean processMessage(Message message) {
....
mClientInterfaceName = mWifiNative.setupInterfaceForClientMode
....
transitionTo(mStartedState); //跳转到 StartedState
}
private class StartedState extends State {
...
private void onUpChanged(boolean isUp) {
....
sendScanAvailableBroadcast(true);
mWifiStateMachine.setOperationalMode(WifiStateMachine.CONNECT_MODE,
// 发 WifiManager.WIFI_STATE_CHANGED_ACTION 广播通知 wifiTracker 启动startScan
updateWifiState(WifiManager.WIFI_STATE_ENABLED,WifiManager.WIFI_STATE_ENABLING);
}
}
2. WifiTracker.BroadcastReceiver --> wifiManager.StartScan
- WifiTracker 广播监听到WifiManager.WIFI_STATE_CHANGED_ACTION ,开启wifiManager.StartScan
frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
public void onReceive(Context context, Intent intent) {
if (WifiManager.