Detener el servicio hasta que se pueda establecer conexión a Internet

Tengo un servicio que funciona sobre la conclusión del cargador. Este servicio requiere conectividad a Internet. ¿Cuál es la mejor práctica para esperar que el dispositivo se conecte a Internet? Móvil de wifi realmente no importa.

Mi solución actual implica un bucle while que sólo verifica ConnectivityManager hasta que una de las redes esté disponible, pero esto se siente vulgar.

¿Hay una mejor manera de hacer esto?

2 Solutions collect form web for “Detener el servicio hasta que se pueda establecer conexión a Internet”

Pero esto se siente vulgar

De hecho: D

  1. Su receptor despierta su servicio de intención de vigilia (probablemente un servicio de intención simple haría, ya que el teléfono no duerme mientras arranca AFAIK)
  2. Servicio registra un receptor para la conectividad
  3. Servicio espera en un CountDownLatch
  4. El receptor despierta el servicio cuando el wifi está conectado

Código esqueleto: https://stackoverflow.com/a/19968708/281545 – su caso es más simple ya que no tiene que despertar el wifi, mantenga cerraduras wifi etc De lo contrario (incluido el caso esto lleva mucho tiempo y radios / CPU dormir – En cuyo caso un servicio de intención simple no lo hará) entre 2 y 3 necesitaría:

2a. Servicio adquiere un bloqueo wifi
2b. Servicio de llamadas reconnect() , reassociate() y lo que sea necesario (esto puede ser específico del dispositivo)

Usted podría utilizar un BroadcastReceiver:

 private class ConnectionMonitor extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) return; boolean noConnectivity = intent.getBooleanExtra( ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); NetworkInfo aNetworkInfo = (NetworkInfo) intent .getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); if (!noConnectivity) { if ((aNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) || (aNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI)) { // start your service stuff here } } else { if ((aNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) || (aNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI)) { // stop your service stuff here } } } } 

A continuación, instancia en algún lugar de su código:

 ConnectionMonitor connectionMonitor = new ConnectionMonitor(); registerReceiver(connectionMonitor, intentFilter); 

Nota: este código viene de Detect 3G o restauración de red Wifi

  • Ejecutar servicio incluso si la aplicación está cerrada (matado)
  • Cómo llamar al método en servicio de otra actividad
  • Revisión 2: Cómo pasar los datos de un servicio de fondo / subproceso a alguna otra actividad que no sea MainActivity que creó el servicio de fondo
  • Google Cloud Messaging - GCM - SERVICE_NOT_AVAILABLE
  • Iniciar servicio desde la notificación
  • ¿Cómo eliminar todas las notificaciones cuando se cancela una aplicación de Android (actividad o servicio)?
  • Servicio de Android: proceso vs. no
  • "No se puede realizar esta acción en una instancia no sellada" excepción java.lang.IllegalStateException
  • Servicio de Android: onBind (Intención) y onUnbind (Intención) se llama una sola vez
  • PopUp diálogo Android de hilo de fondo
  • BadParcelableException: ClaseNotFoundException al unmarshalling
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.