版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/h784707460/article/details/79658950,未经博主允许不得转载。

一、 Android O wifi扫描场景

Android O上的wifi扫面场景可以归结为以下四种:

1、 亮屏情况下,在Wifi settings界面,固定扫描,时间间隔为10s。

2、 亮屏情况下,非Wifi settings界面,二进制指数退避扫描,退避算法:interval*(2^n), 最小间隔min=20s, 最大间隔max=160s.

3、 灭屏情况下,有保存网络时,若已连接,不扫描,否则,PNO扫描,即只扫描已保存的网络。最小间隔min=20s,最大间隔max=60s. (详见Android wifi PNO扫描流程(Android O))

4、 无保存网络情况下,固定扫描,间隔为5分钟,用于通知用户周围存在可用开放网络。

另外,当打开wifi时、进入wifi settings时、亮屏时、灭屏时、链接状态变化时,都会触发扫描。

其中场景1的逻辑在中WifiTracker中控制,2~3的逻辑主要在WifiConnectivityManager中控制,场景4的逻辑在WifiStateMachine中控制。

下面,我们看一下代码逻辑如何实现扫描机制的各种场景(wifi已打开)。

二、 Android O wifi扫描代码实现

1、 亮屏情况下,在Wifi settings界面,固定扫描,时间间隔为10s。

1>. packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.java

public void onStart()

mWifiTracker.startTracking(); //startTracking for scan in a certain interval

public void onStop()

mWifiTracker.stopTracking(); //stop certain_interval_scan

2>. frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java

public void startTracking()

resumeScanning();

public void resumeScanning()

if (mScanner == null) {

mScanner = new Scanner();

}

mWorkHandler.sendEmptyMessage(WorkHandler.MSG_RESUME);

if (mWifiManager.isWifiEnabled()) {

mScanner.resume();

}

class Scanner extends Handler

void resume()

if (!hasMessages(MSG_SCAN)) {

sendEmptyMessage(MSG_SCAN);

}

public void handleMessage(Message message)

mWifiManager.startScan()  //调用wifimanager开始扫描

sendEmptyMessageDelayed(MSG_SCAN, WIFI_RESCAN_INTERVAL_MS); //waiting WIFI_RESCAN_INTERVAL_MS to send msg “MSG_SCAN”

private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;  //default 10s

可以看到每间隔10s发送一次MSG_SCAN消息触发扫描。

3>. frameworks/base/wifi/java/android/net/wifi/WifiManager.java

mService.startScan(null, workSource, packageName);

4>. WifiServiceImpl.java

mWifiStateMachine.startScan(Binder.getCallingUid(), scanRequestCounter++,

settings, workSource);

5>. WifiStateMachine.java

sendMessage(CMD_START_SCAN, callingUid, scanCounter, bundle);

2、 亮屏情况下,非Wifi settings界面,二进制指数退避扫描,退避:interval*(2^n), 最小间隔min=20s, 最大间隔max=160s.

1>. WifiConnectivityManager.java

private void startConnectivityScan(boolean scanImmediately)

if (mScreenOn) {

startPeriodicScan(scanImmediately);

private void startPeriodicScan(boolean scanImmediately)

mPeriodicSingleScanInterval = PERIODIC_SCAN_INTERVAL_MS; //20s

startPeriodicSingleScan();

private void startPeriodicSingleScan()

startSingleScan(isFullBandScan, WIFI_WORK_SOURCE); //scan

schedulePeriodicScanTimer(mPeriodicSingleScanInterval);

mPeriodicSingleScanInterval *= 2; // next scan interval

if (mPeriodicSingleScanInterval >  MAX_PERIODIC_SCAN_INTERVAL_MS) {

mPeriodicSingleScanInterval = MAX_PERIODIC_SCAN_INTERVAL_MS;

} // max is 160s

3、 灭屏情况下,有保存网络时,若已连接,不扫描,否则,PNO扫描,即只扫描已保存的网络。

1>. WifiConnectivityManager.java

public void handleScreenStateChanged

startConnectivityScan(SCAN_ON_SCHEDULE); //开关屏幕时会触发对应的扫描

private void startConnectivityScan(boolean scanImmediately)

if (mScreenOn) {

startPeriodicScan(scanImmediately);

} else {

if (mWifiState == WIFI_STATE_DISCONNECTED && !mPnoScanStarted) {

startDisconnectedPnoScan(); //无连接时启动PNO扫描

}

private void startDisconnectedPnoScan()

if (listSize == 0) {

// No saved network

return; // 无保存网络时,不扫描

}

scanSettings.periodInMs = DISCONNECTED_PNO_SCAN_INTERVAL_MS; //20s

mScanner.startDisconnectedPnoScan(scanSettings, pnoSettings, mPnoScanListener); //有已保存网络时,启动PNO扫描

mPnoScanStarted = true;

(PNO扫描比较复杂,详见Android wifi PNO扫描流程(Android O))

4、 无保存网络情况下,固定扫描,间隔为5分钟,用于通知用户周围存在可用开放网络。

1>. WifiStateMachine.java

DisconnectedState

A. enter()

if (mNoNetworksPeriodicScan != 0 && !mP2pConnected.get()

&& mWifiConfigManager.getSavedNetworks().size() == 0) {

sendMessageDelayed(obtainMessage(CMD_NO_NETWORKS_PERIODIC_SCAN,

++mPeriodicScanToken, 0), mNoNetworksPeriodicScan);

} // mNoNetworksPeriodicScan = 3000s

B. processMessage()

case CMD_NO_NETWORKS_PERIODIC_SCAN:

if (mNoNetworksPeriodicScan != 0 && message.arg1 == mPeriodicScanToken &&

mWifiConfigManager.getSavedNetworks().size() == 0) {

startScan(UNKNOWN_SCAN_SOURCE, -1, null, WIFI_WORK_SOURCE); //scan

sendMessageDelayed(obtainMessage(CMD_NO_NETWORKS_PERIODIC_SCAN,

++mPeriodicScanToken, 0), mNoNetworksPeriodicScan);

}

5、 打开wifi时、进入wifi settings时、亮屏时、灭屏时、链接状态变化时,都会触发扫描。

WifiConnnectivityManager.java

1>.

public void handleConnectionStateChanged(int state) //链接状态变化时,触发对应的扫描

if (mWifiState == WIFI_STATE_DISCONNECTED) {

startConnectivityScan(SCAN_IMMEDIATELY);

} else {

startConnectivityScan(SCAN_ON_SCHEDULE);

}

note:

SCAN_ON_SCHEDULE, SCAN_IMMEDIATELY is false, true. the different is:

        // timer based single scan will be scheduled// to provide periodic scan in an exponential backoff fashion.if (scanImmediately) {resetLastPeriodicSingleScanTimeStamp();}

2>.

public void handleScreenStateChanged //开关屏幕时会触发对应的扫描

startConnectivityScan(SCAN_ON_SCHEDULE);

三、 wifi扫描功耗优化

Android手机一直以来都存在一个问题--待机时间短。对于功耗优化,wifi扫描也可以做一些贡献。通过android wifi扫描场景的分析,结合wifi的具体使用场景,我们可以通过减少不必要的扫面来优化设备的功耗。

1.  亮屏非wifi settings界面,没有保存热点时,不扫描。

因为没有保存热点时,不存在自动链接的情况;用户需要链接热点时,必须进入wifi settings界面,而进入wifi settings界面时,会触发扫描;这种场景下的扫描只用一种作用:通知用户周围存在可用wifi。可以根据实际情况,对此场景进行优化。

2.  亮屏非wifi settings界面,只保存一个且已链接, 不扫描。

这个场景也不存在自动链接的情况;用户需要更换热点时,必须进入wifi settings界面。此场景可以进行优化。

3.  灭屏状态,没有保存热点时,不扫描。

这个场景也没有必要进行扫描,可以进行优化。

4.  已连接热点信号强度较强时,不需要考虑更换热点,在非wifi settings界面,也可以不用进行扫描,优化功耗。

5.  其他场景

如更改扫描间隔进行优化,更改信号强度进行优化等等。

以上扫描优化都可以在上述扫描机制中,通过修改扫描逻辑来实现。

Android wifi扫描机制(Android O)相关推荐

  1. android wifi扫描间隔,[RK3399][Android7.1] 调试笔记 --- WiFi扫描周期规则

    Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 亮屏情况: 1. 在WiFi Settings界面,无论WiFi是否有连接,固定扫描时间间隔为10s. ...

  2. Android设备扫描机制详解

    Android设备扫描机制详解 本文基于Android pie,对Android的设备扫描机制做一个全面的解析,由于本人掌握的知识有限,如有讲错的地方还请大家指出来. Android提供了一套扫描机制 ...

  3. Android Wifi 扫描及自动连接

    Android Wifi 扫描及自动连接 缘起 拆解需求 核心API 权限 核心代码 完整Demo 缘起 最近有个需求,要求App能够自动扫描到某个热点然后自动连接上热点.背景是我们公司属于IoT行业 ...

  4. Android-O wifi扫描机制及功耗优化

    一. Android O wifi扫描场景 Android O上的wifi扫面场景可以归结为以下四种: 1. 亮屏情况下,在Wifi settings界面,固定扫描,时间间隔为10s. 2. 亮屏情况 ...

  5. android 上下扫描动画,Android扫描雷达动画

    很简单的一个组合动画,用好基本动画啥子效果都不怕 老规矩先上图 效果图.gif ok 来 既然往下翻那就看看如何实现的吧 首先效果分为两部分 第一部分中间指针(其实这里就是一张图片) 第二部分就是波纹 ...

  6. Android WiFi OBSS机制

    1 欢迎大家一起学习探讨通信之WLAN.今天我插入一篇探讨下WiFi的新Feature,基于Android 9.0分析探讨. 好,我们先看下OBSS的原型: Overlapping BSS:重叠的BS ...

  7. android wifi 扫描频率,Android WIFI扫描时延

    希望大家能够给个评论,支持下新人,感激不尽. 本文第一篇CSDN博客,欢迎大家关注,如有错误,欢迎批评指正. 本人在做WIFI室内定位时发现Android扫描WIFI的时延不小.在此先附上我扫描wif ...

  8. android WiFi扫描并连接

    wifi扫描并显示 获取列表 获取Wifi列表并不难,网上有一个WifiAdmin的工具类,一找一大堆.但是这个工具类其中还是有很多问题的,并不建议直接使用.在使用过程中还是踩到了其中的一些坑,然后修 ...

  9. android n wifi scan,Android WiFi扫描

    Wifi扫描 权限方面 必须权限如下: ACCESS_WIFI_STATE(用于扫描结束后读取wifi信息) CHANGE_WIFI_STATE(用于扫描WiFi列表) 除必须权限外,根据系统版本,还 ...

最新文章

  1. UVA1327 King‘s Quest(强连通分量、给王子们匹配公主系列 - 1 )
  2. 网媒亟待建立广告价值衡量体系
  3. ios开发中,User Defined Runtime Attributes的应用
  4. vo listVO paggerHelper mapper使用原则
  5. 3、jeecg 笔记之 模糊查询
  6. Spark 学习(十一) spark使用hive的元数据信息
  7. 清理apache日志
  8. SHELL下获得指定进程的进程号,并截取为整数
  9. 坐标字符NYOJ 298 点的变换 (矩阵快速幂)
  10. 天池客流预测–GBDT
  11. MVC获取客户端IP地址方法
  12. 《机器学习》周志华第一章课后习题
  13. java 生成随机加减乘除_用Java随机生成四则运算
  14. 在东京,月薪25万日元能过上什么样的日子啊
  15. 蓝牙打印机PHP代码,小程序调用蓝牙打印机完整代码
  16. 计算机组成原理概念学习DAY3——内部存储器
  17. tampermonkey自动化学习(持续更新~)
  18. APP绕过模拟器-小白版
  19. 科普直播,或将成为金融企业引流获客的渠道
  20. 三星、华为、索尼、联发科等公司已参与 谷歌的 Fuchsia 项目

热门文章

  1. 鸿蒙系统的平板电脑哪个好,鸿蒙平板电脑继承iPad大量优点?网友:是时候与安卓平板说再见了...
  2. 人工智能专栏第三讲——人工智能的伦理与风险
  3. c语言实现任务调度器
  4. 新闻系统(1)之模板机制
  5. C++中的iterator-second
  6. 信息学奥赛一本通题库1000 入门测试题目
  7. html eq判断相等,HTML中Smarty中的if语句条件修饰词eq相等ne、neq不相等,gt大于
  8. 笔记本就能运行的ChatGPT平替来了,附完整版技术报告
  9. 新单词 part 6
  10. Android编程示例:创建机场计划模拟器应用程序