Mã từ Chirag Raval ở trên chắc chắn hoạt động. Vấn đề là người nghe sẽ được gọi ngay cả khi ứng dụng không chạy ở nền trước.
IMHO, cách tiếp cận tốt hơn là đăng ký/hủy đăng ký người nhận theo phương thức onResume()
/onPause()
của tất cả các hoạt động ứng dụng của bạn. Mã này nên làm điều đó:
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);
}
Rõ ràng, xóa đăng ký từ AndroidManifest.xml
tệp.
Sử dụng giải pháp này, người nhận cũng sẽ được gọi khi chuyển đổi giữa các hoạt động của ứng dụng của bạn (giả sử bạn đang đóng chúng). Trong trường hợp này, sử dụng một lá cờ tĩnh (được chia sẻ giữa tất cả các hoạt động của bạn) như trong ví dụ dưới đây (gọi tắt là 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;
}
}
}
Nếu bắt đầu ứng dụng của bạn khi đang ngoại tuyến, thông điệp Toast sẽ xuất hiện; nếu không nó chỉ xuất hiện khi mất/thiết lập lại kết nối.
Q & A khác này có thể giúp: http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts – helios
http: // nhà phát triển .android.com/training/monitoring-device-state/connection-monitoring.html –