El código de Chirag Raval anterior ciertamente funciona. El problema es que el oyente será invocado incluso cuando la aplicación no se está ejecutando en primer plano.
En mi humilde opinión, el mejor enfoque es registrar/anular el registro del receptor en los métodos onResume()
/onPause()
de todas sus actividades de aplicación. Este código debe hacerlo:
private final NetworkStateReceiver stateReceiver = new NetworkStateReceiver();
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(stateReceiver, filter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(stateReceiver);
}
Obviamente, eliminar el registro de AndroidManifest.xml
archivo.
Al usar esta solución, se llamará al receptor también al cambiar entre las actividades de su aplicación (suponiendo que las está cerrando). En tal caso, utilice una bandera estática (que se comparte entre todas sus actividades) como en el ejemplo siguiente (llamado online
):
public class NetworkStateReceiver extends BroadcastReceiver {
private static boolean online = true; // we expect the app being online when starting
public static final String TAG = NetworkStateReceiver.class.getSimpleName();
public void onReceive(Context context, Intent intent) {
Log.d(TAG,"Network connectivity change");
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = manager.getActiveNetworkInfo();
if (ni == null || ni.getState() != NetworkInfo.State.CONNECTED) {
Log.d(TAG,"There's no network connectivity");
if (online) // don't show the message if already offline
Toast.makeText(context, R.string.noInternet, Toast.LENGTH_SHORT).show();
online = false;
} else {
Log.d(TAG,"Network "+ni.getTypeName()+" connected");
if (!online) // don't show the message if already online
Toast.makeText(context, R.string.backOnline, Toast.LENGTH_SHORT).show();
online = true;
}
}
}
Si iniciar su aplicación al estar fuera de línea, aparecerá el mensaje de pan tostado; de lo contrario, aparece solo al perder/restablecer la conexión.
Este otro Q y A podrían ayudar: http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts – helios
http: // desarrollador .android.com/training/monitoring-device-state/connectivity-monitoring.html –