做行程的网站推荐,如何制作完整网页,中国建筑装饰网型号填什么,酒店网站建设流程Android Wifi 的扫描场景分为下面四种情况#xff1a;
1.亮屏情况下#xff0c;在Wifi settings界面#xff0c;固定扫描#xff0c;扫描时间为10s。
2.亮屏情况下#xff0c;在非Wifi settings界面#xff0c;二进制指数退避扫描#xff0c;退避#xff1a;interval…Android Wifi 的扫描场景分为下面四种情况
1.亮屏情况下在Wifi settings界面固定扫描扫描时间为10s。
2.亮屏情况下在非Wifi settings界面二进制指数退避扫描退避interval*(2^n), 最小间隔min20s, 最大间隔max160s.
3.灭屏情况下有保存网络时若已连接不扫描否则PNO扫描即只扫描已保存的网络。最小间隔min20s最大间隔max20s*360s。
4.无保存网络情况下固定扫描间隔为5分钟用于通知用户周围存在可用开放网络。
1.亮屏情况下在Wifi settings界面固定扫描扫描时间为10s。
从 wifi扫描流程梳理 可以看到wifi扫描流程会走到WifiTracker的handleMessage函数中我们看sendEmptyMessageDelayed会发送一条扫描的信息其中包含了WIFI_RESCAN_INTERVAL_MSWIFI_RESCAN_INTERVAL_MS就是默认的扫描周期可以看到系统设置的默认周期是10 * 1000也就是10秒。
WifiTracker.java
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);}2.亮屏情况下在非Wifi settings界面二进制指数退避扫描退避interval*(2^n), 最小间隔min20s, 最大间隔max160s.
WifiConnectivityManager.java
startConnectivityScan -- startPeriodicScan -- startPeriodicSingleScan
private void startConnectivityScan(boolean scanImmediately) {// Always stop outstanding connecivity scan if there is anystopConnectivityScan();if (mWifiState ! WIFI_STATE_CONNECTED mWifiState ! WIFI_STATE_DISCONNECTED) {return;}if (mScreenOn) {startPeriodicScan(scanImmediately);} else {if (mWifiState WIFI_STATE_DISCONNECTED !mPnoScanStarted) {startDisconnectedPnoScan();}}}private void startPeriodicScan(boolean scanImmediately) {mPnoScanListener.resetLowRssiNetworkRetryDelay();if (scanImmediately) {resetLastPeriodicSingleScanTimeStamp();}mPeriodicSingleScanInterval PERIODIC_SCAN_INTERVAL_MS;startPeriodicSingleScan();}// 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;}...............if (isScanNeeded) {mLastPeriodicSingleScanTimeStamp currentTimeStamp;startSingleScan(isFullBandScan, WIFI_WORK_SOURCE);schedulePeriodicScanTimer(mPeriodicSingleScanInterval);// 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;}} else {// Since we already skipped this scan, keep the same scan interval for next scan.schedulePeriodicScanTimer(mPeriodicSingleScanInterval);}}对于扫描间隔的设置 // Periodic scan interval in milli-seconds. This is the scan// performed when screen is on.public static final int PERIODIC_SCAN_INTERVAL_MS 20 * 1000; // 20 seconds// When screen is on and WiFi traffic is heavy, exponential backoff// connectivity scans are scheduled. This constant defines the maximum// scan interval in this scenario.VisibleForTestingpublic static final int MAX_PERIODIC_SCAN_INTERVAL_MS 160 * 1000; // 160 seconds3.灭屏情况下有保存网络时若已连接不扫描否则PNO扫描即只扫描已保存的网络。最小间隔min20s最大间隔max20s*360s。
待续
4.无保存网络情况下固定扫描间隔为5分钟用于通知用户周围存在可用开放网络。
注第四种情况属于Android O的逻辑因为在P的代码里还没有找到关于这个扫描的代码也可能取消了
WifiStateMachine.java
class DisconnectedState extends State {Overridepublic void enter() {Log.i(TAG, disconnectedstate enter);// We dont scan frequently if this is a temporary disconnect// due to p2pif (mTemporarilyDisconnectWifi) {p2pSendMessage(WifiP2pServiceImpl.DISCONNECT_WIFI_RESPONSE);return;}/** clear the roaming state, if we were roaming, we failed */mIsAutoRoaming false;mWifiConnectivityManager.handleConnectionStateChanged(WifiConnectivityManager.WIFI_STATE_DISCONNECTED);/*** If we have no networks saved, the supplicant stops doing the periodic scan.* The scans are useful to notify the user of the presence of an open network.* Note that these are not wake up scans.*/if (mNoNetworksPeriodicScan ! 0 !mP2pConnected.get() mWifiConfigManager.getSavedNetworks().size() 0) {sendMessageDelayed(obtainMessage(CMD_NO_NETWORKS_PERIODIC_SCAN,mPeriodicScanToken, 0), mNoNetworksPeriodicScan);}mDisconnectedTimeStamp mClock.getWallClockMillis();mWifiStateTracker.updateState(WifiStateTracker.DISCONNECTED);}mNoNetworksPeriodicScan mContext.getResources().getInteger(R.integer.config_wifi_no_network_periodic_scan_interval);/frameworks/base/core/res/res/values/config.xml mNoNetworksPeriodicScan在config.xml中注册周期为5分钟。
!-- Integer indicating the framework no networks periodic scan interval in milliseconds. --
integer translatablefalse nameconfig_wifi_no_network_periodic_scan_interval300000/integer