Android wifi扫描机制(Android O)
2018-03-22 19:57
525 查看
一、 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.javapublic void onStart() mWifiTracker.startTracking(); //startTracking for scan in a certain interval public void onStop() mWifiTracker.stopTracking(); //stop certain_interval_scan2>. frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.javapublic 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.javamService.startScan(null, workSource, packageName);4>. WifiServiceImpl.javamWifiStateMachine.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.javaprivate void startConnectivityScan(boolean scanImmediately)if (mScreenOn) { startPeriodicScan(scanImmediately); private void startPeriodicScan(boolean scanImmediately)mPeriodicSingleScanInterval = PERIODIC_SCAN_INTERVAL_MS; //20sstartPeriodicSingleScan(); private void startPeriodicSingleScan()startSingleScan(isFullBandScan, WIFI_WORK_SOURCE); //scanschedulePeriodicScanTimer(mPeriodicSingleScanInterval);mPeriodicSingleScanInterval *= 2; // next scan intervalif (mPeriodicSingleScanInterval > MAX_PERIODIC_SCAN_INTERVAL_MS) { mPeriodicSingleScanInterval = MAX_PERIODIC_SCAN_INTERVAL_MS;} // max is 160s 3、 灭屏情况下,有保存网络时,若已连接,不扫描,否则,PNO扫描,即只扫描已保存的网络。1>. WifiConnectivityManager.javapublic void handleScreenStateChangedstartConnectivityScan(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 networkreturn; // 无保存网络时,不扫描}scanSettings.periodInMs = DISCONNECTED_PNO_SCAN_INTERVAL_MS; //20smScanner.startDisconnectedPnoScan(scanSettings, pnoSettings, mPnoScanListener); //有已保存网络时,启动PNO扫描mPnoScanStarted = true; (PNO扫描比较复杂,详见Android wifi PNO扫描流程(Android O))
4、 无保存网络情况下,固定扫描,间隔为5分钟,用于通知用户周围存在可用开放网络。1>. WifiStateMachine.javaDisconnectedStateA. 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); //scansendMessageDelayed(obtainMessage(CMD_NO_NETWORKS_PERIODIC_SCAN, ++mPeriodicScanToken, 0), mNoNetworksPeriodicScan);} 5、 打开wifi时、进入wifi settings时、亮屏时、灭屏时、链接状态变化时,都会触发扫描。WifiConnnectivityManager.java1>. public void handleConnectionStateChanged(int state) //链接状态变化时,触发对应的扫描if (mWifiState == WIFI_STATE_DISCONNECTED) {startConnectivityScan(SCAN_IMMEDIATELY);} else {startConnectivityScan(SCAN_ON_SCHEDULE);} 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开发实践:WIFI扫描功能的封装
- Android中扫描wifi热点
- Android扫描wifi二维码自动连接wifi
- Android多媒体扫描机制分析(一)
- 在Android中扫描wifi热点演示实例教程
- Android 6.0 扫描wifi 列表获取的权限问题
- Android -- Wifi扫描流程分析
- Android 8 wifi 扫描时间间隔
- Android扫描wifi二维码自动连接wifi
- Android检测网络是否可用并打开、扫描、连接WIFI
- 在Android中扫描wifi热点演示实例教程
- android多媒体扫描机制
- Android WiFi 扫描和连接热点
- android 生成wifi热点以及扫描连接wifi
- Android开发之扫描附近wifi热点并列表显示
- Android WiFi 扫描和连接热点
- Android 扫描wifi局域网ip
- android wifi操作(扫描和连接)
- Android 扫描wifi局域网ip