I'm trying to add some connection state awareness to my app. Using examples here and google's documentation iv'e come up with a receiver that shows an alert correctly when the connection status changed, but also unwantedly shows it whenever the activity is created.
the ConnectStatusReceiver:
package com.zivtaller.placefinder.receivers;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;
public class ConnectStatusReceiver extends BroadcastReceiver {
private String TAG = "netReceiver";
public ConnectStatusReceiver() {
super();
}
@Override
public void onReceive(Context context, Intent arg1) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null
&& activeNetwork.isConnectedOrConnecting();
if (isConnected) {
Log.d(TAG, "Data connected");
Toast.makeText(context, "Data connected", Toast.LENGTH_SHORT)
.show();
} else {
Log.d(TAG, "Data not connected");
Toast.makeText(context, "Data not connected", Toast.LENGTH_SHORT)
.show();
}
}
}
its initialization and registration in activity's onResume():
netReceiver = new ConnectStatusReceiver();
IntentFilter netFilter = new IntentFilter();
netFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(netReceiver, netFilter);
The system is likely generating sticky broadcast android.net.conn.CONNECTIVITY_CHANGE
intents. Sticky broadcasts stay around after they are sent. Whenever you register a BroadcastReceiver
to listen for broadcasts that are sticky, the most recently broadcasted intent will be passed to the receiver immediately when registerReceiver()
is called.
An easy way to test whether or not the android.net.conn.CONNECTIVITY_CHANGE
broadcast is sticky would be to check the return value of your registerReceiver()
call in onResume()
netReceiver = new ConnectStatusReceiver();
IntentFilter netFilter = new IntentFilter();
netFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
Intent intent = registerReceiver(netReceiver, netFilter);
if (intent != null) {
// broadcast is sticky
}
If you are able to determine that the broadcasts are indeed sticky, then what you are experiencing is intended behavior.
See what is the difference between sendStickyBroadcast and sendBroadcast in Android.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With