简介:当手机灭屏情况下,有保存网络时,若已连接,不扫描,否则,PNO扫描,即只扫描已保存的网络。最小间隔min=20s,最大间隔max=20s*3=60s

PNO 即Preferred Network Offload,用于系统在休眠的时候连接WiFi

Wi-Fi PNO扫描流程

WifiConnectivityManager.java
灭屏时,WifiConnectivityManager中handleScreenStateChanged函数会判断是否触发PNO扫描。并且进行PNO扫描列表设置、PNO扫描间隔(20s)设置等PNO扫描的参数设置。所以先从处理屏幕状态改变开始。

public void handleScreenStateChanged(boolean screenOn) {localLog("handleScreenStateChanged: screenOn=" + screenOn);mScreenOn = screenOn;mOpenNetworkNotifier.handleScreenStateChanged(screenOn);mCarrierNetworkNotifier.handleScreenStateChanged(screenOn);startConnectivityScan(SCAN_ON_SCHEDULE);
}

开始连接扫描。 扫描方式根据当前的屏幕状态和WiFi状态选择。这里会选择PNO扫描。

private void startConnectivityScan(boolean scanImmediately) {localLog("startConnectivityScan: screenOn=" + mScreenOn+ " wifiState=" + stateToString(mWifiState)+ " scanImmediately=" + scanImmediately+ " wifiEnabled=" + mWifiEnabled+ " wifiConnectivityManagerEnabled="+ mWifiConnectivityManagerEnabled);if (!mWifiEnabled || !mWifiConnectivityManagerEnabled) {return;}if (mWifiState != WIFI_STATE_CONNECTED && mWifiState != WIFI_STATE_DISCONNECTED) {return;}if (mScreenOn) {startPeriodicScan(scanImmediately);} else {if (mWifiState == WIFI_STATE_DISCONNECTED && !mPnoScanStarted) {startDisconnectedPnoScan();}}}

当屏幕关闭且WiFI未连接时,开启PNO扫描,初始化scan的设置。
可以看到扫描间隔为20s:scanSettings.periodInMs = DISCONNECTED_PNO_SCAN_INTERVAL_MS

private static final int DISCONNECTED_PNO_SCAN_INTERVAL_MS = 20 * 1000; // 20 seconds
private void startDisconnectedPnoScan() {// Initialize PNO settingsPnoSettings pnoSettings = new PnoSettings();List<PnoSettings.PnoNetwork> pnoNetworkList = mConfigManager.retrievePnoNetworkList();int listSize = pnoNetworkList.size();pnoSettings.networkList = new PnoSettings.PnoNetwork[listSize];pnoSettings.networkList = pnoNetworkList.toArray(pnoSettings.networkList);pnoSettings.min5GHzRssi = mMin5GHzRssi;pnoSettings.min24GHzRssi = mMin24GHzRssi;pnoSettings.initialScoreMax = mInitialScoreMax;pnoSettings.currentConnectionBonus = mCurrentConnectionBonus;pnoSettings.sameNetworkBonus = mSameNetworkBonus;pnoSettings.secureBonus = mSecureBonus;pnoSettings.band5GHzBonus = mBand5GHzBonus;// Initialize scan settingsScanSettings scanSettings = new ScanSettings();scanSettings.band = getScanBand();scanSettings.reportEvents = WifiScanner.REPORT_EVENT_NO_BATCH;scanSettings.numBssidsPerScan = 0;scanSettings.periodInMs = DISCONNECTED_PNO_SCAN_INTERVAL_MS;mPnoScanListener.clearScanDetails();mScanner.startDisconnectedPnoScan(scanSettings, pnoSettings, mPnoScanListener);mPnoScanStarted = true;
}

WifiScanner.java
startDisconnectedPnoScan --> startPnoScan 开启PNO扫描

public void startDisconnectedPnoScan(ScanSettings scanSettings, PnoSettings pnoSettings,PnoScanListener listener) {Preconditions.checkNotNull(listener, "listener cannot be null");Preconditions.checkNotNull(pnoSettings, "pnoSettings cannot be null");int key = addListener(listener);if (key == INVALID_KEY) return;validateChannel();pnoSettings.isConnected = false;startPnoScan(scanSettings, pnoSettings, key);
}

startPnoScan发送PNO扫描(CMD_START_PNO_SCAN)的消息,由WifiScanningServiceImpl处理。

private void startPnoScan(ScanSettings scanSettings, PnoSettings pnoSettings, int key) {// Bundle up both the settings and send it across.Bundle pnoParams = new Bundle();// Set the PNO scan flag.scanSettings.isPnoScan = true;pnoParams.putParcelable(PNO_PARAMS_SCAN_SETTINGS_KEY, scanSettings);pnoParams.putParcelable(PNO_PARAMS_PNO_SETTINGS_KEY, pnoSettings);mAsyncChannel.sendMessage(CMD_START_PNO_SCAN, 0, key, pnoParams);
}

WifiScanningServiceImpl.java
从StartedState状态开始,获取到PNO扫描的设置以后,进入HwPnoScanState状态。

class StartedState extends State {.......@Overridepublic boolean processMessage(Message msg) {ClientInfo ci = mClients.get(msg.replyTo);switch (msg.what) {case WifiScanner.CMD_START_PNO_SCAN:........pnoParams.setDefusable(true);PnoSettings pnoSettings =pnoParams.getParcelable(WifiScanner.PNO_PARAMS_PNO_SETTINGS_KEY);if (mScannerImpl.isHwPnoSupported(pnoSettings.isConnected)) {deferMessage(msg);transitionTo(mHwPnoScanState);} else {replyFailed(msg, WifiScanner.REASON_INVALID_REQUEST, "not supported");}.................}return HANDLED;}
}

如果已经有PNO扫描,则进入StartedState。如果没有,则addHwPnoScanRequest。
注意:这里的StartedState是WifiBackgroundScanStateMachine中的StartedState。

class HwPnoScanState extends State {@Overridepublic boolean processMessage(Message msg) {ClientInfo ci = mClients.get(msg.replyTo);switch (msg.what) {case WifiScanner.CMD_START_PNO_SCAN:Bundle pnoParams = (Bundle) msg.obj;if (pnoParams == null) {replyFailed(msg, WifiScanner.REASON_INVALID_REQUEST, "params null");return HANDLED;}pnoParams.setDefusable(true);PnoSettings pnoSettings =pnoParams.getParcelable(WifiScanner.PNO_PARAMS_PNO_SETTINGS_KEY);ScanSettings scanSettings =pnoParams.getParcelable(WifiScanner.PNO_PARAMS_SCAN_SETTINGS_KEY);if (addHwPnoScanRequest(ci, msg.arg2, scanSettings, pnoSettings)) {replySucceeded(msg);} else {replyFailed(msg, WifiScanner.REASON_INVALID_REQUEST, "bad request");transitionTo(mStartedState);}break;...........return HANDLED;}
}

addHwPnoScanRequest --> addPnoScanRequest

private boolean addHwPnoScanRequest(ClientInfo ci, int handler, ScanSettings scanSettings,PnoSettings pnoSettings) {if (ci == null) {Log.d(TAG, "Failing scan request ClientInfo not found " + handler);return false;}if (!mActivePnoScans.isEmpty()) {loge("Failing scan request because there is already an active scan");return false;}WifiNative.PnoSettings nativePnoSettings =convertSettingsToPnoNative(scanSettings, pnoSettings);if (!mScannerImpl.setHwPnoList(nativePnoSettings, mPnoScanStateMachine)) {return false;}logScanRequest("addHwPnoScanRequest", ci, handler, null, scanSettings, pnoSettings);addPnoScanRequest(ci, handler, scanSettings, pnoSettings);return true;
}
private void addPnoScanRequest(ClientInfo ci, int handler, ScanSettings scanSettings,PnoSettings pnoSettings) {mActivePnoScans.addRequest(ci, handler, WifiStateMachine.WIFI_WORK_SOURCE,Pair.create(pnoSettings, scanSettings));addInternalClient(ci);
}

WifiBackgroundScanStateMachine --> StartedState

未完待续。。。。

关注公众号,获取更多开发必备知识

Wi-Fi PNO扫描流程(Android P)相关推荐

  1. Android wifi PNO扫描流程(Andriod O)

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

  2. Android-O wifi PNO扫描流程

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

  3. android 蓝牙扫描流程,Android 9.0 Bluetooth源码分析(二)蓝牙扫描流程

    1 UI 蓝牙开始扫描位于setting的 /packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothPairingDet ...

  4. Android wifi扫描机制(Android O)

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

  5. Android 9 wifi PNO 扫描

    PNO 即Preferred Network Offload,用于系统在休眠的时候连接WiFi 四种场景 亮屏情况: 在WiFi Settings界面,无论WiFi是否有连接,固定扫描时间间隔为10s ...

  6. Android 9.0 蓝牙扫描流程

    微信扫码,给个关注吧 昨天梳理了蓝牙的开启流程,今天梳理一遍扫描流程: 1.UI /packages/apps/Settings/src/com/android/settings/bluetooth/ ...

  7. android静态代码扫描,Android 静态代码扫描流程及工具说明

    1. 静态扫描流程 1.1 版本发布流程 大致分为5个阶段,静态代码扫描的工作在第3步进行,如图: 版本发布流程图 1.2 典型案例分析 [空指针]空指针引用 [内存泄露]Stream资源关闭 [性能 ...

  8. Android 11 WiFi扫描流程梳理

    上一篇我们梳理了WiFi的开启流程,Android11 WiFi开启流程,在最后我们说到ActiveModeWarden中注册了ClientListener监听器.我们接着这个逻辑继续梳理一下打开Wi ...

  9. 第六章 Wi-Fi扫描流程

    系列文章目录 第一章 国内下载AOSP最新源码的方法 第二章 下载AOSP WiFi相关的代码 第三章 将源码导入Android Studio(无需编译idegen) 文章目录 系列文章目录 前言 一 ...

最新文章

  1. import javax.servlet 出错(真的很管用)
  2. 015_面向对象_异常,包和Object类
  3. 物联网技术泡沫多 期望与现实不匹配
  4. oracle 查找 psu,Oracle如何检查当前数据库CPU和PSU补丁信息
  5. 达梦数据源配置_weblogic配置数据源连接达梦数据库
  6. 浙江大学 PTA习题3.6 一元多项式的乘法与加法运算 (20分)
  7. netbeans打包java程序,并包含外部jar包
  8. Android 代码名字-API级别-版本号-NDK版本对应关系
  9. VC6.0用file-open后,出现“MSDEV.EXE-应用程序错误 遇到问题需要关闭“
  10. python之scipy库详解
  11. java自然语言处理_Java自然语言处理NLP工具包
  12. 织梦留言板模板 .php,织梦DEDECMS留言板功能制作及调用标签
  13. java excel 打勾_如何在excel中打钩
  14. 信客 lt;文gt; 余秋雨
  15. python产品作者如何去掉_python去除\ufeff、\xa0、\u3000
  16. MySQL国内镜像下载地址
  17. 根据搜索词使得搜索结果中的关键词改变颜色
  18. 【Git】git push -u origin master 的含义和 -u 的含义
  19. 如何在手机浏览器中控制扫描仪做文档扫描
  20. 条码打印软件如何添加英文格式日期

热门文章

  1. 【数分】7. AB实验篇
  2. AMP Adversarial Motion Priors for Stylized Physics-动作生成算法
  3. ad电阻原理图_Arduino动手做(2)光敏电阻模块
  4. 饱和气压与温度的关系_饱和蒸汽温度与压力关系对照表
  5. docker logs 参数解释
  6. 计算机考试上网题操作步骤,计算机等级考试一级复习 上网试题操作方法-
  7. 基于百度AI实现的语音识别搜索文件
  8. 如何用sql profile 找出执行慢的sql
  9. Linkflow+微信公众号:如何提升首购率
  10. 使用MIT JWI(Java WordNet Interface)查询WordNet反义词