wifi setting界面扫描时间间隔:10s
不在wifi setting界面,扫描时间间隔,最小20s,然后按找2倍的间隔进行递增,40s,60s..., 最大160s
PNO 即Preferred Network Offload,用于系统在休眠的时候连接WiFi 1. wifi setting界面
packages\apps\Settings\src\com\android\settings\wifi\WifiSettings.java
public void onStart() {
mWifiTracker.startTracking(); frameworks\base\packages\SettingsLib\src\com\android\settingslib\wifi\WifiTracker.java
public void startTracking() {
synchronized (mLock) {
registerScoreCache();
// 是否显示wifi评分的UI
mNetworkScoringUiEnabled =
Settings.Global.getInt(
mContext.getContentResolver(),
Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1;
// 是否显示wifi速度
mMaxSpeedLabelScoreCacheAge =
Settings.Global.getLong(
mContext.getContentResolver(),
Settings.Global.SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS,
DEFAULT_MAX_CACHED_SCORE_AGE_MILLIS); resumeScanning();
if (!mRegistered) {
mContext.registerReceiver(mReceiver, mFilter);
// NetworkCallback objects cannot be reused. http://b/20701525 .
mNetworkCallback = new WifiTrackerNetworkCallback();
mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback);
mRegistered = true;
}
} }
扫描服务
public void resumeScanning() {
if (mScanner == null) {
mScanner = new Scanner();
} mWorkHandler.sendEmptyMessage(WorkHandler.MSG_RESUME);
if (mWifiManager.isWifiEnabled()) {
mScanner.resume(); // 发送扫描消息
}
} //
class Scanner extends Handler {
static final int MSG_SCAN = 0; private int mRetry = 0; void resume() {
if (!hasMessages(MSG_SCAN)) {
sendEmptyMessage(MSG_SCAN);
}
} void forceScan() {
removeMessages(MSG_SCAN);
sendEmptyMessage(MSG_SCAN);
} void pause() {
mRetry = 0;
removeMessages(MSG_SCAN);
} @VisibleForTesting
boolean isScanning() {
return hasMessages(MSG_SCAN);
} @Override
public void handleMessage(Message message) {
if (message.what != MSG_SCAN) return;
if (mWifiManager.startScan()) { // 启动扫描
mRetry = 0;
} else if (++mRetry >= 3) {
mRetry = 0;
if (mContext != null) {
Toast.makeText(mContext, R.string.wifi_fail_to_scan, Toast.LENGTH_LONG).show();
}
return;
}
// 扫描界面扫描间隔。
sendEmptyMessageDelayed(MSG_SCAN, WIFI_RESCAN_INTERVAL_MS);
}
}
//private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000; 2. 不在wifisetting界面,亮屏情况下。
frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiConnectivityManager.java public void handleScreenStateChanged(boolean screenOn) {
localLog("handleScreenStateChanged: screenOn=" + screenOn); mScreenOn = screenOn; mOpenNetworkNotifier.handleScreenStateChanged(screenOn); startConnectivityScan(SCAN_ON_SCHEDULE);
} private void startConnectivityScan(boolean scanImmediately) {
localLog("startConnectivityScan: screenOn=" + mScreenOn
+ " wifiState=" + stateToString(mWifiState)
+ " scanImmediately=" + scanImmediately
+ " wifiEnabled=" + mWifiEnabled
+ " wifiConnectivityManagerEnabled="
+ mWifiConnectivityManagerEnabled); if (!mWifiEnabled || !mWifiConnectivityManagerEnabled) {
return;
} // Always stop outstanding connecivity scan if there is any
stopConnectivityScan(); // Don't start a connectivity scan while Wifi is in the transition
// between connected and disconnected states.
if (mWifiState != WIFI_STATE_CONNECTED && mWifiState != WIFI_STATE_DISCONNECTED) {
return;
} if (mScreenOn) {
startPeriodicScan(scanImmediately);
} else {
if (mWifiState == WIFI_STATE_DISCONNECTED && !mPnoScanStarted) {
startDisconnectedPnoScan();
}
}
} // Start a periodic scan when screen is on
private void startPeriodicScan(boolean scanImmediately) {
// 从新设置PNO扫描的时间间隔。
// 当扫描的网络,Rssi比较低时,将会进行从新扫描
mPnoScanListener.resetLowRssiNetworkRetryDelay();
// 漫游关闭时,不进行扫描
// No connectivity scan if auto roaming is disabled.
if (mWifiState == WIFI_STATE_CONNECTED && !mEnableAutoJoinWhenAssociated) {
return;
} // Due to b/28020168, timer based single scan will be scheduled
// to provide periodic scan in an exponential backoff fashion.
if (scanImmediately) {
resetLastPeriodicSingleScanTimeStamp();
}
mPeriodicSingleScanInterval = PERIODIC_SCAN_INTERVAL_MS;
startPeriodicSingleScan();
} @VisibleForTesting
public static final int PERIODIC_SCAN_INTERVAL_MS = 20 * 1000; // 20 seconds // Start a single scan and set up the interval for next single scan.
private void startPeriodicSingleScan() {
long currentTimeStamp = mClock.getElapsedSinceBootMillis(); if (mLastPeriodicSingleScanTimeStamp != RESET_TIME_STAMP) {
long msSinceLastScan = currentTimeStamp - mLastPeriodicSingleScanTimeStamp;
if (msSinceLastScan < PERIODIC_SCAN_INTERVAL_MS) {
localLog("Last periodic single scan started " + msSinceLastScan
+ "ms ago, defer this new scan request.");
schedulePeriodicScanTimer(PERIODIC_SCAN_INTERVAL_MS - (int) msSinceLastScan);
return;
}
} boolean isFullBandScan = true;
// 判断wifi使用率是不是比较高,比较高只进行一部分扫描
// 通过发送和接收速率判断
// If the WiFi traffic is heavy, only partial scan is initiated.
if (mWifiState == WIFI_STATE_CONNECTED
&& (mWifiInfo.txSuccessRate > mFullScanMaxTxRate
|| mWifiInfo.rxSuccessRate > mFullScanMaxRxRate)) {
localLog("No full band scan due to ongoing traffic");
isFullBandScan = false;
}
// 再次判断,如果发送接收速率超过最大值,将不进行扫描。
mLastPeriodicSingleScanTimeStamp = currentTimeStamp;
if (mWifiState == WIFI_STATE_CONNECTED
&& (mWifiInfo.txSuccessRate
> MAX_TX_PACKET_FOR_PARTIAL_SCANS
|| mWifiInfo.rxSuccessRate
> MAX_RX_PACKET_FOR_PARTIAL_SCANS)) {
Log.e(TAG,"Ignore scan due to heavy traffic");
} else {
startSingleScan(isFullBandScan, WIFI_WORK_SOURCE);
} schedulePeriodicScanTimer(mPeriodicSingleScanInterval);
// 设置下一次扫描时间间隔,是当前的2倍。
// 最大扫描时间间隔160s
// public static final int MAX_PERIODIC_SCAN_INTERVAL_MS = 160 * 1000; // 160 seconds
// Set up the next scan interval in an exponential backoff fashion.
mPeriodicSingleScanInterval *= 2;
if (mPeriodicSingleScanInterval > MAX_PERIODIC_SCAN_INTERVAL_MS) {
mPeriodicSingleScanInterval = MAX_PERIODIC_SCAN_INTERVAL_MS;
}
} 3. pno扫描
private void startDisconnectedPnoScan() {
// TODO(b/29503772): Need to change this interface. // Initialize PNO settings
PnoSettings pnoSettings = new PnoSettings();
List<PnoSettings.PnoNetwork> pnoNetworkList = mConfigManager.retrievePnoNetworkList();
int listSize = pnoNetworkList.size(); if (listSize == 0) {
// No saved network
localLog("No saved network for starting disconnected PNO.");
return;
} 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 settings
ScanSettings scanSettings = new ScanSettings();
scanSettings.band = getScanBand();
scanSettings.reportEvents = WifiScanner.REPORT_EVENT_NO_BATCH;
scanSettings.numBssidsPerScan = 0;
scanSettings.periodInMs = DISCONNECTED_PNO_SCAN_INTERVAL_MS; // 20s mPnoScanListener.clearScanDetails(); mScanner.startDisconnectedPnoScan(scanSettings, pnoSettings, mPnoScanListener);
mPnoScanStarted = true;
}
待续。。。

Android 8 wifi 扫描时间间隔的更多相关文章

  1. android 8 wifi wifi 扫描过程

    查看一下android wifi扫描的过程. packages\apps\Settings\src\com\android\settings\wifi\WifiSettings.java public ...

  2. 【Android】wifi开发

    WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点 ...

  3. android.net.wifi的简单使用方法

    获取Wifi的控制类WifiManager.  WifiManager  wm=(WifiManager)getSystemService(Context.WIFI_SERVICE); 接下来可以对w ...

  4. 【移动开发】Android中WIFI开发总结(二)

    搞了好几天终于有点眉目了,这里接着总结一下Android中WiFi的使用,在前面(http://smallwoniu.blog.51cto.com/3911954/1334951)我们已经简单了解了W ...

  5. 【移动开发】Android中WIFI开发总结(一)

     WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热 ...

  6. Android 连接Wifi和创建Wifi热点 demo

    android的热点功能不可见,用了反射的技术搞定之外. Eclipse设置语言为utf-8才能查看中文注释 上代码: MainActivity.java package com.widget.hot ...

  7. android之wifi开发

    WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点 ...

  8. android 获取wifi列表,如果你忽略了这个细节,可能你的软件会崩溃

    一:业务描述 最近公司有一个小需求,用户点击wifi扫描按钮(注意:是用户主动点击wifi扫描按钮),app去扫描附近的wifi,显示在listView中,仅此而已,app都不用去连接某个wifi,看 ...

  9. Android之Wifi学习(1)

    在Android中对Wifi操作,android本身提供了一些实用的包.在android.net.wifi包以下.简介一下: 大致能够分为四个基本的类ScanResult,wifiConfigurat ...

随机推荐

  1. mingw环境添加mysql开发库

    今天碰巧要用到mysql进行开发,在windows的mingw平台. 0.下载mysql http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-noinstal ...

  2. epoll, NIO,AIO

    Java 网络IO编程总结(BIO.NIO.AIO均含完整实例代码) Java中BIO,NIO和AIO使用样例 https://blog.insanecoder.top/javazhong-bio-n ...

  3. Android使用binder访问service的方式(一)

    binder机制是贯穿整个android系统的进程间访问机制,经常被用来访问service,我们结合代码看一下binder在访问service的情形下是怎么具体使用的. service 你可以理解成没 ...

  4. 在IIS服务器上屏蔽IP的访问

    今天就跟大家分享一下在IIS服务器上如何屏蔽特定IP的访问,希望对大家有所帮助. 第一种方法:通过iis中的ip地址和域名限制. 此方法简单有效,建议使用 点击网站--右键属性--目录安全性--IP地 ...

  5. Windows删除/修改注册表权限不足的解决方法

    在注册表的某些关键项(譬如:System.Root),连Administrator都没有权限进行修改,因为只有“system”有权限. [警告]切勿企图进行注册表上层权限覆盖低层权限的方式来使Admi ...

  6. img的src不连接本地地址实现输出一个图片(使用base64)

    <img alt="100%x180" data-src="holder.js/100%x180" style="height: 180px; ...

  7. Python(九)之网络编程

    一般的网络通信: Python中利用socket模块实现网络主机间通讯: socket.socket(family,type) family:套接字类型 AF_INET AF_UNIX type: S ...

  8. poj1182(种类并查集好题)

    不得不说,我得感谢@驱动幽灵百鬼夜行小肆,正是因为看明白了他给出的解析,我才完全弄懂种类并查集的,这里,我也不想去改其他的,就直接引用他的解题报告吧 转载:http://blog.csdn.net/c ...

  9. Eigen教程(7)

    整理下Eigen库的教程,参考:http://eigen.tuxfamily.org/dox/index.html 归约.迭代器和广播 归约 在Eigen中,有些函数可以统计matrix/array的 ...

  10. Android GridView的使用页面按钮

    GridView(网格视图),用来显示网格,用来显示一些按钮比较好用. 上代码吧. 主页面:activity_main.xml 添加一个GridView用来显示按钮的列表 <?xml versi ...