2011-08-17 10 views
20

En la aplicación para Android que estoy diseñando, mi servicio sólo tiene que estar en ejecución cuando el dispositivo está conectado al router (a través de WiFi, obviamente). Soy nuevo en Android, y lo que tengo hasta ahora me ha llevado para siempre a Achieve, así que realmente espero algunos consejos.Android: ¿Detener/Iniciar servicio dependiendo del estado de WiFi?

Mi servicio está configurado para poner en marcha cuando el teléfono se pone en marcha. Además, cuando se inicia la actividad, se verifica si el servicio se está ejecutando, y si no, lo inicia. me pregunto qué código que puedo poner en mi servicio para que sea apagar si se pierde el estado de Wi-Fi - y qué código que necesita para que el servicio se inicia una vez que una conexión Wi-Fi se activa?

Gracias! :)

Respuesta

26

Se puede crear un BroadcastReceiver que maneja los cambios de conexión WiFi.

Para ser más precisos, tendrá que crear una clase - dice NetWatcher:

public class NetWatcher extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     //here, check that the network connection is available. If yes, start your service. If not, stop your service. 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo info = cm.getActiveNetworkInfo(); 
     if (info != null) { 
      if (info.isConnected()) { 
       //start service 
       Intent intent = new Intent(context, MyService.class); 
       context.startService(intent); 
      } 
      else { 
       //stop service 
       Intent intent = new Intent(context, MyService.class); 
       context.stopService(intent); 
      } 
     } 
    } 
} 

(cambiando MyService al nombre de su servicio).

Además, en su AndroidManifest, es necesario añadir las siguientes líneas:

<receiver android:name="com.example.android.NetWatcher"> 
    <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
    </intent-filter> 
</receiver> 

(cambiando com.example.android al nombre de su paquete).

+2

Gracias! Esta fue la base de mi solución. La clase NetWatcher era exactamente lo que necesitaba, pero esta solución es verdadera si la conexión de datos móviles está activada (el servicio solo necesita ejecutarse cuando WiFi está activo, no datos móviles). Solución: WifiManager wifiManager = (WifiManager) this.getSystemService (Context.WIFI_SERVICE); if (wifiManager.isWifiEnabled()) { // iniciar el servicio } else { // detener el servicio } –

+0

Debería ser 'Intent intent = new Intent (context, MyService.class);' Usar 'this' como argumento para la intención constructor no es válido dentro de un 'BroadcastReceiver'. También debería ser 'context.startService (intent)'. – faizal

+0

@faizal gracias por las sugerencias de limpieza. He editado esta publicación para incluirlos. – Phil

7

Como se ha indicado @Phil, debe ampliar BroadcastReceiver, y en el método OnReceive iniciar o detener el servicio. Algo así como:

class ConnectionChangeReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     ConnectivityManager connectivityManager = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 
     if (activeNetInfo != null && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) { 
      //start service 
     } else { 
      //stop service 
     } 
    } 
} 

Usted puede hacer esto una clase privada de su actividad, y registrar la actividad del receptor en crear y anular el registro de la actividad de destruir.

1

Para iniciar/detener el servicio cuando supplicant estado de Wi-Fi está OK/NOK:

  • registrar un BroadcastReceiver para recibir los cambios de estado WIFI intentos emitidos
  • dentro de su BroadcastReceiver comprobar la validez intento entonces comenzar su servicio

Así registrar su receptor de radio para recibir WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION. Agregar permiso android.permission.CHANGE_WIFI_STATE o android.permission.ACCESS_NETWORK_STATE. No estoy seguro de si es necesario o no.

A continuación, un código de receptor de radiodifusión muestra podría ser: se proporciona

public class MyWifiStatereceiver extends BroadcastReceiver { 
    //Other stuff here 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent srvIntent = new Intent(); 
     srvIntent.setClass(MyService.class); 
     boolean bWifiStateOk = false; 

     if (WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION.equals(intent.getAction()) { 
      //check intents and service to know if all is ok then set bWifiStateOk accordingly 
      bWifiStateOk = ... 
     } else { 
      return ; // do nothing ... we're not in good intent context doh ! 
     } 

     if (bWifiStateOk) { 
      context.startService(srvIntent); 
     } else { 
      context.stopService(srvIntent); 
     } 
    } 

} 
Cuestiones relacionadas