您的位置:首页 > 理论基础 > 计算机网络

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

2017-12-21 15:48 417 查看
有时候需要监听网络的状态变化来及时提醒用户网络状况,因此我们得多各种网络变化进行监听,废话不多说,将网络各种情况都在代码中列出来了,有需求的可以根据实际情况进行提示。

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网络的监听,而第三个是针对整个网络的监听,所以为了区分,将整个网络的监听称之未总网络。

所以如果要进行网络的判断可以在最后个总网络里面进行判断,各种情况都已经注释清楚了,需要的可以根据自己情况进行提醒。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐