一:業務描述 最近公司有一個小需求,用戶點擊wifi掃描按鈕(註意:是用戶主動點擊wifi掃描按鈕),app去掃描附近的wifi,顯示在listView中,僅此而已,app都不用去連接某個wifi,看似簡單的需求,如果沒處理好,可能導致app直接掛掉。 二:代碼如下 註冊接收掃描wifi的廣播 啟動 ...
一:業務描述
最近公司有一個小需求,用戶點擊wifi掃描按鈕(註意:是用戶主動點擊wifi掃描按鈕),app去掃描附近的wifi,顯示在listView中,僅此而已,app都不用去連接某個wifi,看似簡單的需求,如果沒處理好,可能導致app直接掛掉。
二:代碼如下
註冊接收掃描wifi的廣播
private void registerBroadcast(){ IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); mContext.registerReceiver(mBroadcastReceiver,intentFilter); }
啟動掃描
@Override public void onClick(View v) { switch (v.getId()) { case R.id.scanWifi: if (!wifiManager.isWifiEnabled()) { //開啟wifi wifiManager.setWifiEnabled(true); } wifiManager.startScan(); wifiSsidRightIcon.setEnabled(false); break; } }
獲取掃描結果的廣播
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String resultAction = intent.getAction(); Logger.e(TAG+"收到wifi相關的廣播:"+resultAction);
//其它業務代碼省略,如顯示出一共有多少個wifi熱點,以及刷新wifi熱點的列表
} }
三:問題描述
開發完成後,同事在測試該模塊的時候,直接告訴我,app還沒點擊掃描wifi就掛了,我過去看到app的確掛了,是每次必掛,然而我通過記錄的日誌,看到如下信息:
03-19 15:42:56.471 2112-2112/com.advert E/PRETTYLOGGER: ║ ConfigHelperFragment$2.onReceive (ConfigHelperFragment.java:376)
03-19 15:42:56.471 2112-2112/com.advert E/PRETTYLOGGER: ║ ConfigHelperFragment:收到wifi相關的廣播:android.net.wifi.SCAN_RESULTS
03-19 15:42:56.487 2112-2112/com.advert I/PRETTYLOGGER: ║ ConfigHelperFragment$2.onReceive (ConfigHelperFragment.java:387)
03-19 15:42:56.488 2112-2112/com.advert I/PRETTYLOGGER: ║ ConfigHelperFragment:掃描結果:Router-DK
03-19 15:42:58.838 2112-2112/com.advert E/PRETTYLOGGER: ║ ConfigHelperFragment$2.onReceive (ConfigHelperFragment.java:376)
03-19 15:42:58.839 2112-2112/com.advert E/PRETTYLOGGER: ║ ConfigHelperFragment:收到wifi相關的廣播:android.net.wifi.SCAN_RESULTS
03-19 15:43:06.496 2112-2112/com.advert E/PRETTYLOGGER: ║ ConfigHelperFragment$2.onReceive (ConfigHelperFragment.java:376)
03-19 15:43:06.496 2112-2112/com.advert E/PRETTYLOGGER: ║ ConfigHelperFragment:收到wifi相關的廣播:android.net.wifi.SCAN_RESULTS
03-19 15:43:06.515 2112-2112/com.advert I/PRETTYLOGGER: ║ ConfigHelperFragment$2.onReceive (ConfigHelperFragment.java:387)
03-19 15:43:06.515 2112-2112/com.advert I/PRETTYLOGGER: ║ ConfigHelperFragment:掃描結果:YTC
以上信息是,點擊掃描wifi後,收到wifi掃描到結果的廣播,關鍵是根本沒有手動去點擊啟動掃描,還是收到了這個廣播,並且是連續的收到這個廣播,當時有點懵了,百度後也沒找到類似的問題。靜下心來仔細一想,肯定是其它程式觸發了wifi掃描,所以才收到這個廣播,但也說不過去,為什麼會不停的收到這個廣播呢?於是,我打開設置-WLAN,看到如下一幕:
上圖是我連續看了近30秒,系統自帶wifi列表,仔細看圖一和圖二第三項,wifi列表發生了變化,看到這裡,導致軟體掛掉的原因算是找到了,因為android設備wifi打開後,會自動掃描附近的wifi,如果有可用的wifi,設備直接連接,如果沒有可用的wifi,設備會繼續搜索,直到關閉wifi,或者搜索到可用的wifi為止。
為什麼我本地沒有出現問題,而同事測試就出現了,正是因為我測試的設備,已經連接上一個可用wifi熱點,而同事的設備是新的,並且之前打開了wifi開關,所以導致了他測試時,app掛掉。知道是這個原因,解決這個問題就簡單了,進入這個activity時,判斷一下,如果當前wifi是打開的,直接關閉就ok.
代碼如下:
public static void closeWifi(WifiManager wifiManager) {
if (wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(false);
}
}