Android 实时监听获取系统Wifi列表

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/rikkatheworld/article/details/100655664

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管理类去吧 = =。

猜你喜欢

转载自blog.csdn.net/rikkatheworld/article/details/100655664