###1. android wifi 循环扫描
在android系统中, 在不同的场景下, 不同的功能模块会发起循环扫描
大部分扫描功能需要调用WPAS的接口来完成, 可先阅读 “WPAS” 分类中的 “WPAS 中的循环扫描”
###2. 亮屏时Wifi Settings界面的扫描
只要打开wifi, 进入wifi settings界面, 无论是否连接了AP, 都会开始定时扫描
相关源码为 “pacakes/app/Settings/src/com/android/settings/wifi/WifiSettings.java” Wifi Setting 中由 class Scanner来负责发起扫描, calss Scaner继承了Handlerl来实现定时扫描:
- 延时向自己发送一个空message
- 接收到message后, 立即调用WifiManager执行一次扫描, 然后再次延时向自己发送空message
- 向自己发送空message的延时值即为扫描的间隔, 默认为10s (int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;)
其向自己延时(WIFI_RESCAN_INTERVAL_MS)发送message, 接收到mesage后, 执行一次扫描来实现定时扫描, 其提供了3个接口
Scanner.pause() //移除还未被发送的空message, 中止定时扫描
Scanner.resume() //向自己发送一个空的message, 恢复扫描
Scanner.forceScan() //移除还未被发送的的空message, 并立即发送一个空message, 导致马上进行一次扫描
- 在wifi Settings的onpause()阶段, 中止定时扫描
- 在wifi Settings的onresume()阶段, 恢复定时扫描
- 点击wifi Settings菜单的scan选项, 则进行一次强制扫描
- 关闭wifi会中止定时扫描
- 打开wifi会恢复定时扫描
- 在wifi 处于DHCP状态时, 中止定时扫描, 变为其它状态后再恢复定时扫描
###3.亮屏时 wpa_supplicant 的周期扫描
在亮屏, 未连接wifi, WPAS中保存了AP的情况下,WPAS会周期扫描,android上调整间隔为15s, 可在 frameworks/base/core/res/res/values/config.xml 文件中修改。
<integer translatable="false" name="config_wifi_supplicant_scan_interval">15000</integer>
###4. 灭屏时 PNO 扫描
如果未连接AP, 但是保存有AP, 在灭屏后, 会开启PNO扫描, 标准的PNO扫描机制为
- 以10秒时间间隔扫描6次
- 以20秒扫描间隔扫描6次
- 以40秒时间间隔扫描6次
- 以80秒时间间隔扫描6次
- 以160秒时间间隔扫描6次
- 以后将以320秒时间间隔进行扫描
###5. autojoin 扫描
如果打开了autojoin机制, 且保存了AP, 无论是亮屏还是灭屏, autojoin会周期扫描, 间隔为10s
###6. batch scan
batch scan 通过从applicantion offloading scan 到 wifi firmware 来达到节省电力的目标, applicantion可以请求wifi firmware在指定的时间间隔内发起指定次数的扫描, wifi firmware根据限定的频率持续进行扫描并且缓存扫描结果, 定期将扫描结果返回给 ACPU
batch scan 需要wifi driver 和 wifi firmware支持, wifiManager提供了接口来使用batch scan,例如:
- requestBatchedScan()
- isBatchedScanSupported()
- stopBatchedScan()
- getBatchedScanResults()
- pollBatchedScan()
batch scan主要应用于wifi 辅助定位