一:业务描述java
最近公司有一个小需求,用户点击wifi扫描按钮(注意:是用户主动点击wifi扫描按钮),app去扫描附近的wifi,显示在listView中,仅此而已,app都不用去链接某个wifi,看似简单的需求,若是没处理好,可能致使app直接挂掉。android
二:代码以下app
注册接收扫描wifi的广播ide
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; } }
获取扫描结果的广播spa
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String resultAction = intent.getAction(); Logger.e(TAG+"收到wifi相关的广播:"+resultAction);
//其它业务代码省略,如显示出一共有多少个wifi热点,以及刷新wifi热点的列表
} }
三:问题描述.net
开发完成后,同事在测试该模块的时候,直接告诉我,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,看到以下一幕:code
上图是我连续看了近30秒,系统自带wifi列表,仔细看图一和图二第三项,wifi列表发生了变化,看到这里,致使软件挂掉的缘由算是找到了,由于android设备wifi打开后,会自动扫描附近的wifi,若是有可用的wifi,设备直接链接,若是没有可用的wifi,设备会继续搜索,直到关闭wifi,或者搜索到可用的wifi为止。blog
为何我本地没有出现问题,而同事测试就出现了,正是由于我测试的设备,已经链接上一个可用wifi热点,而同事的设备是新的,而且以前打开了wifi开关,因此致使了他测试时,app挂掉。知道是这个缘由,解决这个问题就简单了,进入这个activity时,判断一下,若是当前wifi是打开的,直接关闭就ok.
代码以下:
public static void closeWifi(WifiManager wifiManager) {
if (wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(false); }}