android之网络状态判断(wifi和移动网络数据)

有时候需要监听网络的状态变化来及时提醒用户网络状况,因此我们得多各种网络变化进行监听,废话不多说,将网络各种情况都在代码中列出来了,有需求的可以根据实际情况进行提示。
1.首先需要进行广播的监听,网络状态变化会触发广播:

//静态注册
<receiver
    android:name=".receiver.StartServiceReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />//监听wifi的打开和关闭
        <action android:name="android.net.wifi.STATE_CHANGE" />//监听wifi的连接状态
    </intent-filter>
</receiver>

//动态注册,此广播只能动态注册才能接收到
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);//网络的连接(包括wifi和移动网络)

以上是广播的注册,对于wifi的监听有两种广播,都支持静态注册,但是对于整个网络的监听(wifi+移动网络数据)只能动态注册。

2.对广播进行接收和分析:

public class StartServiceReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 监听wifi的打开与关闭,与wifi的连接无关
        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {
            int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
            if (wifiState == WifiManager.WIFI_STATE_DISABLED) {//wifi关闭
                MlogUtil.d("netstatus", "wifi已关闭");
            } else if (wifiState == WifiManager.WIFI_STATE_ENABLED) {//wifi开启
                MlogUtil.d("netstatus", "wifi已开启");
            } else if (wifiState == WifiManager.WIFI_STATE_ENABLING) {//wifi开启中
                MlogUtil.d("netstatus", "wifi开启中");
            } else if (wifiState == WifiManager.WIFI_STATE_DISABLING) {//wifi关闭中
                MlogUtil.d("netstatus", "wifi关闭中");
            }
        }
        // 监听wifi的连接状态即是否连上了一个有效无线路由
        if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
            Parcelable parcelableExtra = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            if (parcelableExtra != null) {
                MlogUtil.d("netstatus", "wifi parcelableExtra不为空");
                NetworkInfo networkInfo = (NetworkInfo) parcelableExtra;
                if (networkInfo.getState() == NetworkInfo.State.CONNECTED) {//已连接网络
                    MlogUtil.d("netstatus", "wifi 已连接网络");
                    if (networkInfo.isAvailable()) {//并且网络可用
                        MlogUtil.d("netstatus", "wifi 已连接网络,并且可用");
                    } else {//并且网络不可用
                        MlogUtil.d("netstatus", "wifi 已连接网络,但不可用");
                    }
                } else {//网络未连接
                    MlogUtil.d("netstatus", "wifi 未连接网络");
                }
            } else {
                MlogUtil.d("netstatus", "wifi parcelableExtra为空");
            }
        }
        // 监听网络连接,总网络判断,即包括wifi和移动网络的监听
        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
            NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            //连上的网络类型判断:wifi还是移动网络
            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                MlogUtil.d("netstatus", "总网络 连接的是wifi网络");
            } else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
                MlogUtil.d("netstatus", "总网络 连接的是移动网络");
            }
            //具体连接状态判断
            checkNetworkStatus(networkInfo);
        }
    }

    private void checkNetworkStatus(NetworkInfo networkInfo) {
        if (networkInfo != null) {
            MlogUtil.d("netstatus", "总网络 info非空");
            if (networkInfo.getState() == NetworkInfo.State.CONNECTED) {//已连接网络
                MlogUtil.d("netstatus", "总网络 已连接网络");
                if (networkInfo.isAvailable()) {//并且网络可用
                    MlogUtil.d("netstatus", "总网络 已连接网络,并且可用");
                } else {//并且网络不可用
                    MlogUtil.d("netstatus", "总网络 已连接网络,但不可用");
                }
            } else if (networkInfo.getState() == NetworkInfo.State.DISCONNECTED) {//网络未连接
                MlogUtil.d("netstatus", "总网络 未连接网络");
            }
        } else {
            MlogUtil.d("netstatus", "总网络 info为空");
        }
    }
}

如上,log打印区分了总网络和wifi网络判断,因为前2个是专门针对wifi网络的监听,而第三个是针对整个网络的监听,所以为了区分,将整个网络的监听称之未总网络。
所以如果要进行网络的判断可以在最后个总网络里面进行判断,各种情况都已经注释清楚了,需要的可以根据自己情况进行提醒。

发布了33 篇原创文章 · 获赞 49 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/gsw333/article/details/78864604