Yukarıdaki Chirag Raval kodları kesinlikle çalışır. Sorun, uygulama ön planda çalışmadığında bile dinleyicinin çağrılacağıdır.
IMHO, daha iyi bir yaklaşım, tüm uygulama aktivitelerinizdeki onResume()
/onPause()
yöntemlerini kaydettirmek/kaydını kaldırmaktır. Açıkçası
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);
}
AndroidManifest.xml
dosyadan kayıt kaldırmak: Bu kod yapmalı.
Bu çözümü kullanarak, alıcı, uygulamanızın etkinlikleri arasında geçiş yaparken de çağrılacaktır (bunları kapattığınızı varsayarak). Böyle bir durumda, aşağıdaki örnekte (denilen online
) gibi statik bir bayrağı (tüm faaliyetler arasında paylaşılan) kullanın: çevrimdışı olma yaparken uygulamanızı başlayan Eğer
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;
}
}
}
, Tost mesajı görünür; aksi halde yalnızca bağlantıyı kaybederken/yeniden kurduğunda görünür.
Bu, diğer Q & A yardımcı olabilir: http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts – helios
http: // geliştiricisi .android.com/training/monitoring-device-state/bağlantı-monitoring.html –