使用ConnectivityManager来获取、监听当前的网络状态

获取网络连接状态

ConnectivityManager可以获取Android系统的网络连接相关信息,它是系统服务中的一员:

ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
得到管理器对象后,调用getActiveNetworkInfo()即可获得当前活动的网络连接信息了,若无网络访问,返回NULL

NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
根据getType()返回的值来判断是哪一种网络连接类型,一般来说,我们只要判断有无、是否是WIFI就行了

        int state = NETWORK_NULL;
        if(mNetworkInfo != null){
            switch (mNetworkInfo.getType()){
                case -1:
                    state = NETWORK_NULL;
                    break;
                case ConnectivityManager.TYPE_MOBILE:
                    state = NETWORK_MOBILE;
                    break;
                case ConnectivityManager.TYPE_WIFI:
                    state = NETWORK_WIFI;
                    break;
                default:
                    state = NETWORK_OTHER;
                    break;
            }
        }

监听网络连接变更

网络连接变更时,系统会发送一条广播,自定义一个广播接收者来监听这个广播,我们就可以随时监听网络变更事件

该广播为:"android.net.conn.CONNECTIVITY_CHANGE"

它是ConnectivityManager的常量:ConnectivityManager.CONNECTIVITY_ACTION


代码如下:

/**
 * 监听网络状态的接收者
 * <p>
 * 需要权限:
 * <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 * <p>
 * 需要注册过滤器:
 * <p>
 * <intent-filter>
 * <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
 * </intent-filter>
 */
public class NetworkStateBroadcastReceiver
        extends BroadcastReceiver {
    
    public enum State {
        /** 没有网络 */
        NULL,
        /** 手机3G、GPRS网络 */
        MOBILE,
        /** WIFI网络 */
        WIFI,
        /** 其它网络连接(如蓝牙) */
        OTHER
    }
    
    /** 当前的网络状态 */
    private static State sState;
    
    /** 监听网络状态的对象集合,使用了弱引用持有对象,当回调时,才会清除已释放的弱引用对象 */
    private static final LinkedList<NetworkStateListener> mListeners = new LinkedList<>();
    
    static {
        //获取网络连接管理器
        ConnectivityManager mConnectivityManager =
                (ConnectivityManager) ApplicationHolder.instance().getSystemService(Context.CONNECTIVITY_SERVICE);
        //当前的网络连接信息
        NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
        //判断当前的网络状态
        State s = State.NULL;
        if (mNetworkInfo != null) {
            switch (mNetworkInfo.getType()) {
                case -1:
                    s = State.NULL;
                    break;
                case ConnectivityManager.TYPE_MOBILE:
                    s = State.MOBILE;
                    break;
                case ConnectivityManager.TYPE_WIFI:
                    s = State.WIFI;
                    break;
                default:
                    s = State.OTHER;
                    break;
            }
        }
        sState = s;
    }
    
    @Override
    public void onReceive(Context context, Intent intent) {
        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
            //获取当前网络状态
            int networkType = intent.getIntExtra("networkType", -1);
            State s;
            switch (networkType) {
                case -1:
                    s = State.NULL;
                    break;
                case ConnectivityManager.TYPE_MOBILE:
                    s = State.MOBILE;
                    break;
                case ConnectivityManager.TYPE_WIFI:
                    s = State.WIFI;
                    break;
                default:
                    s = State.OTHER;
                    break;
            }
            if (s != sState) {
                //将结果回调给监听者
                sState = s;
                doCallBack(sState);
            }
        }
    }
    
    /** 网络状态变化时,回调接口 */
    private static synchronized void doCallBack(State state) {
        for (NetworkStateListener listener : mListeners) {
            listener.onNetworkStateChanged(state);
        }
    }
    
    /** 添加网络状态变化的监听者 */
    public static synchronized void addListener(@NonNull NetworkStateListener listener) {
        mListeners.add(listener);
    }
    
    /** 添加网络状态变化的监听者,并进行一次初始化的回调 */
    public static synchronized void addListenerWithInitCall(@NonNull NetworkStateListener listener) {
        mListeners.add(listener);
        listener.onNetworkStateChanged(sState);
    }
    
    /** 移除网络状态变化的监听者 */
    public static synchronized boolean removeListener(@NonNull NetworkStateListener listener) {
        return mListeners.remove(listener);
    }
    
    /** 监听网络状态变化的接口 */
    public interface NetworkStateListener {
        
        void onNetworkStateChanged(State state);
    }
    
    /** 获取当前状态 */
    public static State getState() {
        return sState;
    }
    
    /** 是否有网络 */
    public static boolean hasNetwork() {
        return sState != State.NULL;
    }
    
    /** 是否有WIFI连接 */
    public static boolean hasWifi() {
        return sState == State.WIFI;
    }
    
}


对外开放了几个静态方法来获取当前的网络状态及监听网络状态变化。
addListener添加监听者时,为避免内存泄漏,应在Activity的onDestory阶段调用removeListener移除监听者。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章