2011-08-17 14 views
20

Nell'applicazione Android che sto progettando, il mio servizio deve essere attivo solo quando il dispositivo è connesso al router (ovviamente tramite WiFi). Sono davvero nuovo per Android, e quello che ho ottenuto finora mi ha portato per sempre ad Achieve, quindi spero davvero in alcuni suggerimenti.Android: il servizio Stop/Start dipende dallo stato WiFi?

Il servizio è impostato per l'avvio all'avvio del telefono. Inoltre, all'avvio dell'attività, controlla se il servizio è in esecuzione e, in caso contrario, lo avvia. Mi chiedo quale codice posso inserire nel mio servizio per farlo spegnere se lo stato WiFi è perso - e quale codice ho bisogno per far partire il servizio quando una connessione WiFi diventa attiva?

Grazie! :)

risposta

26

È possibile creare un BroadcastReceiver che gestisce le modifiche alla connessione wifi.

Per essere più precisi, si vuole creare una classe - 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 nome del servizio).

Inoltre, nel vostro AndroidManifest, è necessario aggiungere le seguenti righe:

<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 nome del pacchetto).

+2

Grazie! Questa era la base della mia soluzione. La classe NetWatcher era esattamente ciò di cui avevo bisogno, ma questa soluzione è vera se la connessione dati mobile è attiva (il servizio deve essere eseguito solo quando il WiFi è attivo, non i dati mobili). Soluzione: WifiManager wifiManager = (WifiManager) this.getSystemService (Context.WIFI_SERVICE); se (wifiManager.isWifiEnabled()) { // start service } else { // stop service } –

+0

Dovrebbe essere 'Intent intent = new Intent (context, MyService.class);' Usando 'this' come argomento per l'Intent costruttore non è valido all'interno di un 'BroadcastReceiver'. Inoltre dovrebbe essere 'context.startService (intent)'. – faizal

+0

@faizal grazie per i suggerimenti di pulizia. Ho modificato questo post per includerli. – Phil

7

Come dichiarato da @Phil, è necessario estendere BroadcastReceiver e nel metodo onReceive avviare o interrompere il servizio. Qualcosa di simile:

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 
     } 
    } 
} 

Si può fare questo una classe privata della vostra attività, e registrare il ricevitore sull'attività creare, e annullare la registrazione su attività distruggere.

1

Per avviare/arrestare il servizio quando supplicante stato Wifi è ok/NOK:

  • registrare un BroadcastReceiver per ricevere WIFI cambiamento di stato intenti trasmessi
  • all'interno del vostro BroadCastReceiver verificare la validità intento quindi avviare il servizio

Quindi registrare il destinatario della trasmissione per ricevere WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION. Aggiungi permesso android.permission.CHANGE_WIFI_STATE o android.permission.ACCESS_NETWORK_STATE. Non sono sicuro se sia necessario o meno.

Poi un codice di trasmissione del ricevitore di esempio potrebbe essere:

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); 
     } 
    } 

} 
Problemi correlati