最近在寫一個通過廣播監聽網絡狀態改變,並給用戶一個提示的功能。
測試的時候發現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, "網絡連接已斷開");
}
}
}
希望對大家有用!