Android: oyente de cambio de conectividad de Internet

Ya tengo este código que escucha el cambio de conectividad.

public class NetworkStateReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Log.d("app","Network connectivity change"); if(intent.getExtras() != null) { NetworkInfo ni = (NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO); if(ni != null && ni.getState() == NetworkInfo.State.CONNECTED) { Log.i("app", "Network " + ni.getTypeName() + " connected"); } } if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) { Log.d("app", "There's no network connectivity"); } } } 

Y compruebo la conectividad de Internet usando este código: comprobación de Internet

Pero el problema es que si la red pierde de repente la conexión a Internet sin ningún cambio de conectividad, este código es inútil. ¿Hay alguna manera de crear el receptor de Broadcast Receiver para el cambio de conectividad de Internet? Tengo una aplicación web y los cambios repentinos en la conectividad a Internet pueden causar problemas.

Prueba esto

 public class NetworkUtil { public static final int TYPE_WIFI = 1; public static final int TYPE_MOBILE = 2; public static final int TYPE_NOT_CONNECTED = 0; public static final int NETWORK_STATUS_NOT_CONNECTED = 0; public static final int NETWORK_STATUS_WIFI = 1; public static final int NETWORK_STATUS_MOBILE = 2; public static int getConnectivityStatus(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); if (null != activeNetwork) { if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) return TYPE_WIFI; if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) return TYPE_MOBILE; } return TYPE_NOT_CONNECTED; } public static int getConnectivityStatusString(Context context) { int conn = NetworkUtil.getConnectivityStatus(context); int status = 0; if (conn == NetworkUtil.TYPE_WIFI) { status = NETWORK_STATUS_WIFI; } else if (conn == NetworkUtil.TYPE_MOBILE) { status = NETWORK_STATUS_MOBILE; } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) { status = NETWORK_STATUS_NOT_CONNECTED; } return status; } } 

Y para BroadcastReceiver

 public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, final Intent intent) { int status = NetworkUtil.getConnectivityStatusString(context); Log.e("Sulod sa network reciever", "Sulod sa network reciever"); if ("android.net.conn.CONNECTIVITY_CHANGE".equals(intent.getAction())) { if (status == NetworkUtil.NETWORK_STATUS_NOT_CONNECTED) { new ForceExitPause(context).execute(); } else { new ResumeForceExitPause(context).execute(); } } } } 

No olvides poner esto en tu AndroidManifest.xml

          

Espero que esto te ayude, ¡Salud!

Actualización :

Las aplicaciones orientadas a Android 7.0 (API nivel 24) y superior no reciben transmisiones CONNECTIVITY_ACTION si declaran el receptor de difusión en su manifiesto. Las aplicaciones seguirán recibiendo transmisiones de CONNECTIVITY_ACTION si registran su BroadcastReceiver con Context.registerReceiver () y ese contexto sigue siendo válido.

Debe registrar el receptor a través del método registerReceiver() :

  IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"); mCtx.registerReceiver(new NetworkBroadcastReceiver(), intentFilter); 

Esto debería funcionar:

 public class ConnectivityChangeActivity extends Activity { private BroadcastReceiver networkChangeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d("app","Network connectivity change"); } }; @Override protected void onResume() { super.onResume(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(networkChangeReceiver, intentFilter); } @Override protected void onPause() { super.onPause(); unregisterReceiver(networkChangeReceiver); } }