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

  • En Android: ¿Cómo llamar a la función de la actividad de un servicio?
  • Servicio de asignar un montón de memoria?
  • Android: ¿Cómo repetir un servicio con AlarmManager cada 15 minutos, pero sólo se ejecuta de 8:00 AM a 18:00 PM?
  • Iniciar servicio desde la notificación
  • cómo abrir la configuración de accesibilidad de mi aplicación directamente?
  • OnServiceConnected nunca llamado después del método bindService
  • Subida de imágenes de Android: ¿Utilizar actividad o servicio?
  • La notificación de la barra de estado de Android lanza una nueva aplicación aunque esté en ejecución. ¿Cómo sincronizar la aplicación de lanzamiento desde el icono de la aplicación y la notificación de barra de estado?
  • El mejor enfoque para ejecutar el servicio en Android
  • Cómo utilizar NotificationCompat.Builder y startForeground?
  • Android - widget de actualización sobre el servicio con datos de la red. ¿El mejor enfoque?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.