在wifi启动扫描的分析过程当中,出现了屡次WifiMonitor的操做,在此分析一下这个函数是如何工做的。
在Android的Wifi体系中,WifiMonitor承担着分发来自wpa_supplicant底层事件的任务。当上层下达Wifi的扫描、链接等指令后, 底层驱动以及wpa_s进行实际的扫描、链接操做,操做完成后会向上层反馈一个event,通知framework扫描是否结束、链接是否成功。
1.WifiMonitor的初始化
在WifiStateMachine的构造函数中获取WifiMonitor的实例,而且在WifiStateMachine的构造函数中注册了一系列的handler。app
从启动扫描流程中可知,在启动过程当中会调用startMonitoring(),开始监遵从底层上报的消息。函数
2.startMonitoring()this
为了监听wpa_supplicant的事件,须要先创建与wpa_s的消息通道,这一步调用WifiNative.connectToSupplicant()实现。
若是是第一次进行监听mConnected为false,进入else分支。先创建与wpa_s的消息通道,创建成功后会向WifiStateMachine发送SUP_CONNECTION_EVENT消息,通知Wifi状态机。随后,开启事件监听线程:new MonitorThread(mWifiNative, this).start():线程
这里咱们假设事先下发的是一个wifi扫描的指令,wpa_s反馈event通知wifi扫描的结果,根据实现的一些匹配规则,最后进入handleEvent()函数,此处event是SCAN_RESULTS,向WifiStateMachine发送SCAN_RESULTS_EVENT消息,告知它扫描已经结束,能够去读取扫描结果了。这样,处理流程就用返回到Wifi状态机中。WifiStateMachine收到此消息后,调用WifiStateMachine::setScanResults()方法从wpa_s读取扫描结果,并向外界发送WifiManager.SCAN_RESULTS_AVAILABLE_ACTION广播通知应用。此时一些注册过该广播的应用,例如手机中的Setting app,就能经过调用WifiManager::getScanResults()读取扫描结果了。至此,一个简单的WifiMonitor分发事件的流程结束,其余类型事件的分发跟此过程类似。3d
至此,一个简单的上层流程分析结束了。
---------------------
blog