wifi setting界面扫描时间间隔:10s不在wifi setting界面,扫描时间间隔,最小20s,然后按找2倍的间隔进行递增,40s,60s..., 最大160sPNO 即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 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;    }    待续。。。

更多相关文章

  1. Android用户界面开发(20):SeekBar
  2. Android(安卓)MediaScanner.cpp 源代码解析
  3. Android(安卓)中Uri的用法汇总
  4. 手把手教你学Android(基础篇)
  5. Android5.0以上的状态栏透明和沉浸式模式兼容底部导航栏与界面重
  6. Android用户界面设计:线性布局
  7. 设置界面android 设置界面
  8. 【Android(安卓)UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2
  9. Android(安卓)二维码扫描源码下载

随机推荐

  1. 一种Android数据请求框架
  2. Android逐帧动画——让图片动起来
  3. Freescale IMX6 Android (7): Android启
  4. Android应用盈利广告平台的嵌入方法详解
  5. 从架构师的角度分析Android Handler 源码
  6. android LinearLayout 单击动态改变背景
  7. 开放是一种博大的胸怀
  8. android 从文件制定位置读取数据
  9. Android(安卓)Studio报错unable to acces
  10. Android 音乐播放器的实现