I faced to one problem on android 4.0.3 (on 4.1.2 it works fine). I have in my Activity BroadcastReceiver. When I send a broadcast, method onReceive() called always twice. P
I had fixed this issue by using a static value.
Please find my code below.
My Activity
private static Snackbar mSnackbar;
private NetworkChangeReceiver mNetworkChangeReceiver;
@Override
protected void onResume() {
super.onResume();
registerReceivers();
}
@Override
protected void onPause() {
super.onPause();
unRegisterReceivers();
}
private void registerReceivers() {
mNetworkChangeReceiver = new NetworkChangeReceiver() {
@Override
protected void onNetworkChange(boolean status) {
if (!status) {
if (mSnackbar == null) {
mSnackbar = Snackbar
.make(drawer, R.string.no_internet, Snackbar.LENGTH_INDEFINITE)
.setActionTextColor(Color.YELLOW)
.setAction(R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
mSnackbar.show();
}
} else {
if (mSnackbar != null) {
mSnackbar.dismiss();
mSnackbar = null;
}
}
}
};
IntentFilter nwStateChangeFilter = new IntentFilter();
nwStateChangeFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
nwStateChangeFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
registerReceiver(mNetworkChangeReceiver, nwStateChangeFilter);
}
private void unRegisterReceivers() {
unregisterReceiver(mNetworkChangeReceiver);
}
NetworkChangeReceiver.Class
public abstract class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) { // connected to the internet
if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI){
// connected to wifi
onNetworkChange(true);
} else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
// connected to the mobile provider's data plan
onNetworkChange(true);
} else {
// not connected to the internet
onNetworkChange(false);
}
} else {
// not connected to the internet
onNetworkChange(false);
}
}
protected abstract void onNetworkChange(boolean status);
}