最近在写一个通过广播监听网络状态改变,并给用户一个提示的功能。

测试的时候发现onReceive方法竟然莫名执行了3次,我在onReceive方法中写了个吐司作为提示,这样的话就会连续产生三个吐司,用户体验相当差。网上也查了好多,基本上没有发现有用的(至少无法解决本人目前项目中遇到的问题);所有重新想了一个办法,给BroadcastReceiver加个标志判断。具体如下:

public class NetworkStateReceiver extends BroadcastReceiver {
private static final String TAG = "NetworkStateReceiver";
private boolean flag = true;//加个标志,否则onReceive方法会重复接收通知

/**
* 这是判断网络是否可用的方法
*
* @param context
* @return
*/
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//新版本调用方法获取网络状态
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Network[] networks = connectivityManager.getAllNetworks();
NetworkInfo networkInfo;
for (Network mNetwork : networks) {
networkInfo = connectivityManager.getNetworkInfo(mNetwork);
if (networkInfo.getState().equals(NetworkInfo.State.CONNECTED)) {
return true;
}
}
} else {
//否则调用旧版本方法
if (connectivityManager != null) {
NetworkInfo[] info = connectivityManager.getAllNetworkInfo();
if (info != null) {
for (NetworkInfo anInfo : info) {
if (anInfo.getState() == NetworkInfo.State.CONNECTED) {
Log.d("Network", "NETWORKNAME: " + anInfo.getTypeName());
return true;
}
}
}
}
}
return false;
}

@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "network state changed.");
if (!isNetworkAvailable(context) && flag) {
flag = false;
ToastUtils.showShort(context, "网络连接已断开");
}
}
}

希望对大家有用!