美文网首页Android知识Android技术知识Android开发
《Android wifi系列文章四》广播接收者接收wifi的状

《Android wifi系列文章四》广播接收者接收wifi的状

作者: TrillGates | 来源:发表于2017-03-02 15:14 被阅读2212次

    《Android wifi系列文章四》广播接收者接收wifi的状态改变

    上一篇文章,我们把核心类过了一次,大家把注释看完就差不多了。主要是知道有什么方法用于操作wifi,这里的话我们接着上一篇文章,我们把这个广播接收者也实现它。

    我们要监听的广播有那些呢?

    上一篇文章,我们把核心类过了一次,大家把注释看完就差不多了。主要是知道有什么方法用于操作wifi,这里的话我们接着上一篇文章,我们把这个广播接收者也实现它。

    Paste_Image.png

    我们要监听的广播有那些呢?

    /**
     * Broadcast intent action indicating that Wi-Fi has been enabled, disabled,
     * enabling, disabling, or unknown. One extra provides this state as an int.
     * Another extra provides the previous state, if available.
     *
     * @see #EXTRA_WIFI_STATE
     * @see #EXTRA_PREVIOUS_WIFI_STATE
     */
    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
    public static final String WIFI_STATE_CHANGED_ACTION =
        "android.net.wifi.WIFI_STATE_CHANGED";
    

    这个Action呢,用于监听wifi的开关状态。它有5中状态,分别是:打开状态,打开中状态,关闭状态,关闭中状态,未知状态。上面的文档也说到了,我们可以通过:

      int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
    

    来获取到wifi的状态。而默认的话给0即可, 默认是不可用嘛!
    具体的状态值如下:

    /**
         * Wi-Fi is currently being disabled. The state will change to {@link #WIFI_STATE_DISABLED} if
         * it finishes successfully.
         *
         * @see #WIFI_STATE_CHANGED_ACTION
         * @see #getWifiState()
         */
        public static final int WIFI_STATE_DISABLING = 0;
        /**
         * Wi-Fi is disabled.
         *
         * @see #WIFI_STATE_CHANGED_ACTION
         * @see #getWifiState()
         */
        public static final int WIFI_STATE_DISABLED = 1;
        /**
         * Wi-Fi is currently being enabled. The state will change to {@link #WIFI_STATE_ENABLED} if
         * it finishes successfully.
         *
         * @see #WIFI_STATE_CHANGED_ACTION
         * @see #getWifiState()
         */
        public static final int WIFI_STATE_ENABLING = 2;
        /**
         * Wi-Fi is enabled.
         *
         * @see #WIFI_STATE_CHANGED_ACTION
         * @see #getWifiState()
         */
        public static final int WIFI_STATE_ENABLED = 3;
        /**
         * Wi-Fi is in an unknown state. This state will occur when an error happens while enabling
         * or disabling.
         *
         * @see #WIFI_STATE_CHANGED_ACTION
         * @see #getWifiState()
         */
        public static final int WIFI_STATE_UNKNOWN = 4;
    

    如果你要获取前一个wifi的状态也是可以的哦,使用这个键就可以了:EXTRA_PREVIOUS_WIFI_STATE

    好啦,那么这个意图就讲到这里啦,下面继续下一个吧!

    /**
      * An access point scan has completed, and results are available from the supplicant.
      * Call {@link #getScanResults()} to obtain the results. {@link #EXTRA_RESULTS_UPDATED}
      * indicates if the scan was completed successfully.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS";
    

    上面这个呢是扫描结果的通知广播,也就是说,当我们在wifi控制器类中发起扫描的时候,扫描有结果了,那么系统就会发出这个广播,当我们收到这个广播以后,我们就可以去wifi控制器里头拿扫描结果了。

    /**
         * Broadcast intent action indicating that the state of Wi-Fi connectivity
         * has changed. One extra provides the new state
         * in the form of a {@link android.net.NetworkInfo} object. If the new
         * state is CONNECTED, additional extras may provide the BSSID and WifiInfo of
         * the access point.
         * as a {@code String}.
         * @see #EXTRA_NETWORK_INFO
         * @see #EXTRA_BSSID
         * @see #EXTRA_WIFI_INFO
         */
        @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
        public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE";
    

    上面这个意图呢用于判断wifi连接的,如果已经连接上的话,我们可以拿到wifi的信息,SSID,已经网络信息,再用这些信息去更新UI显示。

    其实,基本这三个Action就够了,如果还要知道连接中的状态改变,那么还需要监听这个Action:

    /**
        * Broadcast intent action indicating that the state of establishing a connection to
        * an access point has changed.One extra provides the new
        * {@link SupplicantState}. Note that the supplicant state is Wi-Fi specific, and
        * is not generally the most useful thing to look at if you are just interested in
        * the overall state of connectivity.
        * @see #EXTRA_NEW_STATE
        * @see #EXTRA_SUPPLICANT_ERROR
        */
       @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
       public static final String SUPPLICANT_STATE_CHANGED_ACTION =
           "android.net.wifi.supplicant.STATE_CHANGE";
    

    这里的话,我们监听三个。你可能使用动态注册,动态注册的话,记得要在销毁的时候,进行取消注册,否则会导致内存泄露的呢!
    动态注册的代码:

    /**
     * 在这里注册广播接收者
     * 这里面注册广播的话,包括:
     * 1 wifi开启状态的监听(wifi关闭,wifi打开)
     * 2 wifi连接的广播
     * 3 wifi连接状态改变的广播
     * <p>
     */
    private void registerBroadcastReceiver() {
     
        IntentFilter filter = new IntentFilter();
        //设置意图过滤
     
        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
     
        wifiReceiver = new WifiReceiver(listener);
        registerReceiver(wifiReceiver, filter);
     
    }
    

    那么取消注册的代码如下:

    if (null != wifiReceiver) {
               unregisterReceiver(wifiReceiver);
        }
    

    好啦,到这里的话就解释完了,具体的话看代码吧,看下面的代码,有注释的呢。后面的回调我们再下一篇文章中解释吧!

    package cn.com.sunofbeaches.wifidemo;
     
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.net.NetworkInfo;
    import android.net.wifi.WifiInfo;
    import android.net.wifi.WifiManager;
     
    import cn.com.sunofbeaches.wifidemo.interfaces.WifiReceiverActionListener;
     
    /**
     * Created by Administrator on 2017/2/25.
     */
    public class WifiReceiver extends BroadcastReceiver {
     
     
        private final WifiReceiverActionListener mListener;
     
        public WifiReceiver(WifiReceiverActionListener listener) {
            //通过构造方法把回调接口扔进来
            this.mListener = listener;
        }
     
     
        @Override
        public void onReceive(Context context, Intent intent) {
     
            //判断Action
            String action = intent.getAction();
     
            if (null == mListener) {
                return;
            }
     
            switch (action) {
                case WifiManager.WIFI_STATE_CHANGED_ACTION:
                    //WIFI打开还是关闭或者是位置状态
                    handlerWifiState(intent);
                    break;
                case WifiManager.SCAN_RESULTS_AVAILABLE_ACTION:
                    //扫描结果
                    handlerWifiScanResult();
                    break;
                case WifiManager.NETWORK_STATE_CHANGED_ACTION:
                    //用于判断连接状态
                    handlerWifiConnectState(intent);
                    break;
            }
     
        }
     
     
        /**
         * 这个方法用于处理wifi的连接状态发生改变
         *
         * @param intent
         */
        private void handlerWifiConnectState(Intent intent) {
     
            //拿到NetworkInfo
            NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            //判断连接上了哈
            if (null != networkInfo && networkInfo.isConnected()) {
                //连接上了,就把wifi的信息传出去
                WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
                if (wifiInfo != null) {
                    //把结果回传出去
                    mListener.onWifiConnected(wifiInfo);
                }
            }
     
        }
     
     
        /**
         * 这个方法用于通知wifi扫描有结果
         */
        private void handlerWifiScanResult() {
            mListener.onWifiScanResultBack();
        }
     
     
        /**
         * 这个方法用于处理wifi的状态,打开,打开中..关闭,关闭中..
         *
         * @param intent
         */
        private void handlerWifiState(Intent intent) {
            int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
            //对wifi的状态进行处理
            switch (wifiState) {
                case WifiManager.WIFI_STATE_ENABLED:
                    //wifi已经打开..
                    mListener.onWifiOpened();
                    break;
                case WifiManager.WIFI_STATE_ENABLING:
                    //wifi打开中..
                    mListener.onWifiOpening();
                    break;
                case WifiManager.WIFI_STATE_DISABLED:
                    //wifi关闭了..
                    mListener.onWifiClosed();
                    break;
                case WifiManager.WIFI_STATE_DISABLING:
                    //wifi关闭中..
                    mListener.onWifiClosing();
                    break;
                case WifiManager.WIFI_STATE_UNKNOWN:
                    //未知状态..
                    break;
            }
        }
     
    }
    

    这个接受者的构造方法,我们需要传下一个回调接口,这个回调接口是用于通知UI更新的,这样子的话,不管是那个界面要更新UI,都可以传个接口就行了嘛。
    具体这个接口怎么写,会在下一篇文章中解释!感谢你的阅读,喜欢就点赞吧!分享也行哈!!

    转载请说明出处,本文地址:
    http://bbs.sunofbeaches.com/thread-5769-1-1.html

    相关文章

      网友评论

        本文标题:《Android wifi系列文章四》广播接收者接收wifi的状

        本文链接:https://www.haomeiwen.com/subject/wstkgttx.html