版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
App内,获取Wifi列表的重点方法 一个是 WifiManager.startScan()
,另个一个是 WifiManager.getScanResults()
注意的几点
- 关于
getScanResults()
,并不是每次单单的去调用 get,就能获取到最新的WIFI信息。它不是实时的,它只有在第一次获取的时候是正确的,后面不去做别的而再次调用这个方法,即使WIFI列表真的变化了,但 get回来的list还是不会变的。 - 解决上述的方法是每次get之前,调用
startScan()
,这个方法的效果等于我们直接去系统的WIFI界面点击刷新,刷新之后,Manager的getScanResults()就能刷新到最新的wifi信息 - 并不是每次
startScan()
后立马getScanResults()
就能 get到最新的信息,可能有 几十ms到几百ms的延迟等,如果一直轮询这两个方法,也不会出现什么问题。
针对上述的第三点的优化,我需要去做一个监听WIFI列表变化的广播,等到Wifi确实是变了,我再去 get。
所以分为三步,关于scan和get我封装成一个类。
而为了做到实时监听,我做了一个TimerTask去轮询
public class WifiUtil {
/**
* 扫描之前需要刷新附近的Wifi列表,这需要使用startScan方法
*/
public static void scanStart(Context context) {
WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
mWifiManager.startScan();
}
/**
* 扫描附近wifi
*/
public static List<ScanResult> scanWifiInfo(Context context) {
WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
List<ScanResult> mWifiList = new ArrayList<>();
mWifiList.clear();
if (!mWifiManager.isWifiEnabled()) {
mWifiManager.setWifiEnabled(true);
}
mWifiList = mWifiManager.getScanResults();
LogUtil.d(TAG, "mWifiList size :" + mWifiList.size());
return mWifiList;
}
}
Activity中使用 TimerTask和BroadcastReciver去轮询这两个方法:
public class ChooseWifiActivity extends BaseActivity{
private Timer timer;
private TimerTask timerTask;
private List<ScanResults> wifiResultList = new ArrayList<>();
@Override
public void initData() {
...
startTimeTask();
registerWifiReceiver();
}
private void startTimeTask() {
if (timer == null) {
timer = new Timer();
}
if (timerTask == null) {
timerTask = new TimerTask() {
@Override
public void run() {
WifiUtil.scanStart(ChooseWifiActivity .this);
}
};
}
timer.schedule(timerTask, 0, 5 * 1000);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (timer != null) {
timer.purge();
timer.cancel();
timer = null;
}
this.unregisterReceiver(wifiReceiver);
}
@Override
public void finish() {
EventBus.getDefault().post(new DeviceNotFoundGoBackEvent());
EventBus.getDefault().post(new FinishNetWorkEvent());
super.finish();
}
private void registerWifiReceiver() {
//注册广播
wifiReceiver = new WifiBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);//监听wifi是开关变化的状态
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);//监听wifi连接状态广播,是否连接了一个有效路由
filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);//监听wifi列表变化(开启一个热点或者关闭一个热点)
this.registerReceiver(wifiReceiver, filter);
}
//监听wifi状态
public class WifiBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {
LogUtil.d(TAG, "网络变化了");
scanWifi();
}
}
}
private void scanWifi() {
wifiResultList = WifiUtil.scanWifiInfo(this);
adapter.notifyDataSetChanged(wifiResultList);
}
}
要点还是要去startScan(),不过这个方法在Android P马上就要被弃用了。到时候可能会把这个方法移到更厉害的 WIFI管理类去吧 = =。