Il codice da Chirag Raval sopra funziona sicuramente. Il problema è che il listener verrà richiamato anche quando l'applicazione non è in esecuzione in primo piano.
IMHO, l'approccio migliore è registrare/annullare la registrazione del ricevitore nei metodi onResume()
/onPause()
di tutte le attività dell'applicazione. Questo codice dovrebbe farlo:
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);
}
Ovviamente, rimuovere la registrazione dal file AndroidManifest.xml
.
Utilizzando questa soluzione, il ricevitore verrà chiamato anche quando si passa da un'attività all'altra dell'applicazione (supponendo che le si chiuda). In tal caso, utilizzare un flag statico (condivisa tra tutte le attività), come nell'esempio che segue (chiamato 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;
}
}
}
Se iniziare la vostra applicazione in cui essere non in linea, verrà visualizzato il messaggio di Brindisi; altrimenti appare solo quando si perde/ristabilisce la connessione.
Quest'altra Q & A potrebbe aiutare: http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts – helios
http: // sviluppatore .android.com/training/monitoring-device-state/connettività-monitoring.html –