版权声明:本文为博主原创文章,博客地址: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. NLP突破性成果 BERT 模型详细解读 bert参数微调
  2. 零基础搭建个性化精准营销 AI 应用,这次手把手教你!
  3. 黑苹果系统坏了如何恢复_黑苹果怎么修复Clover GUI启动选项 黑苹果怎么自定义Clover GUI启动选项...
  4. 基于树的模型的机器学习
  5. Identity Server4学习系列四之用户名密码获得访问令牌
  6. java 懒加载模式_JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载
  7. docker选择安装路径_Docker安装
  8. 混日子不是你的错,根源在这里
  9. 自动化运维工具 ansible的安装 及远程操作命令
  10. 互联网30年,泡沫如梦
  11. 互联网从此没有 BAT
  12. 彻底清除mplay.com与mplay.exe病毒
  13. Java银行账户管理系统实验总结
  14. 环艺考计算机英语吗,应届考取北理环艺分享|愿汗水泪水都不会被辜负!
  15. matlab偏导数方程,[转载]Matlab求解微分方程(2)——偏微分方程的求解
  16. Python:seaborn的散点图矩阵(Pairs Plots)可视化数据
  17. BP神经网络做分类+隐含层节点确定+红酒数据为例
  18. 阿里云HaaS100物联网开发板学习笔记(一)硬件资源介绍
  19. uni-app 什么是datacom?
  20. 纪中游记 - Day 1

热门文章

  1. 瑜伽教学法 | 在瑜伽老师这条路上我们都迷茫过,你是否也想过要放弃
  2. iOS GPUImage研究总结
  3. Oracle 导入数据库 删除用户、删除表空间、删除表空间下所有表,查看当前表空间
  4. 【开发教程5】开源蓝牙心率防水运动手环-电池电量检测
  5. android 充电图标
  6. 使用手机摄像头实现视频监控实时播放
  7. 名帖378 祝允明 草书《饮中八仙歌》
  8. S9全球总决赛全网直播,腾讯云成最强辅助
  9. docker安装及启动mysql服务
  10. MySQL建表(create table)命令详解