在我们平常开发中,有很多场景需要监听网络状态的变化。今天,我们来实现该功能。大致效果如下:
<!-- ---------------------卖萌的分割线--------------------- -->
首先我们先看一下大概Demo结构:
既然涉及到网络,因此我们需要在AndroidManifest文件中添加以下权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
接下来,贴一下NetUtils类的代码,该类主要用于判断目前网络状态,代码不复杂,直接上代码:
package network;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class NetUtils {
// 判断网络连接状态
public static boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager
.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
// 判断wifi状态
public static boolean isWifiConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWiFiNetworkInfo = mConnectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mWiFiNetworkInfo != null) {
return mWiFiNetworkInfo.isAvailable();
}
}
return false;
}
// 判断移动网络
public static boolean isMobileConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mMobileNetworkInfo = mConnectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (mMobileNetworkInfo != null) {
return mMobileNetworkInfo.isAvailable();
}
}
return false;
}
// 获取连接类型
public static int getConnectedType(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager
.getActiveNetworkInfo();
if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
return mNetworkInfo.getType();
}
}
return -1;
}
}
接下来是NetReceiver类,该类是广播接收器,用于接收网络状态变化的广播,直接贴代码:
package receiver;
import interf.IChangeTextCallback;
import network.NetUtils;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
public class NetReceiver extends BroadcastReceiver {
private IChangeTextCallback mCallback;
public NetReceiver(IChangeTextCallback callback) {
this.mCallback = callback;
}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {
boolean isConnected = NetUtils.isNetworkConnected(context);
System.out.println("网络状态:" + isConnected);
System.out.println("wifi状态:" + NetUtils.isWifiConnected(context));
System.out.println("移动网络状态:" + NetUtils.isMobileConnected(context));
System.out.println("网络连接类型:" + NetUtils.getConnectedType(context));
/*
* if (isConnected) { Toast.makeText(context, "已经连接网络",
* Toast.LENGTH_LONG).show(); } else { Toast.makeText(context,
* "已经断开网络", Toast.LENGTH_LONG).show(); }
*/
if (NetUtils.isWifiConnected(context)) {
mCallback.setText("wifi");
} else if (NetUtils.isMobileConnected(context)) {
mCallback.setText("移动网络");
} else if (!isConnected) {
mCallback.setText("无网络");
}
}
}
}
接下来是MainActivity,该Activity布局就只是一个简单的TextView,我们在这里实现了IChangeTextCallback回调接口,用于传入上面的Receiver回调更改Activity的UI。代码如下:
package com.example.nettest;
import interf.IChangeTextCallback;
import receiver.NetReceiver;
import android.app.Activity;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity implements IChangeTextCallback {
NetReceiver mReceiver = new NetReceiver(this);
IntentFilter mFilter = new IntentFilter();
private TextView mTextview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextview = (TextView) this.findViewById(R.id.text);
mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mReceiver, mFilter);
}
@Override
protected void onDestroy() {
unregisterReceiver(mReceiver);
super.onDestroy();
}
@Override
public void setText(String text) {
mTextview.setText(text);
}
}
最后是IChangeTextCallback回调接口,很简单就一行代码:
package interf;
public interface IChangeTextCallback {
public void setText(String text);
}
这样 ,我们就实现了Android对网络状态的实时监听以及做出相对应的操作。