2012-05-24 19 views
27

Ho iniziato a sviluppare un'app che aggiornerà il database ogni volta che il telefono è connesso al WiFi. Ho implementato un Service e BroadcastReceiver che eseguirà il Service (mi dirà quale rete è in uso), ma il problema è che non so cosa aggiungere nel file manifest per avviare BroadcastReceiver quando lo stato della rete cambia o quando si collega a un qualche tipo di reteBroadcastReceiver quando è cambiato lo stato della rete wifi o 3g

Grazie.

risposta

57

Vorrete

<intent-filter> 
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/> 
<action android:name="android.net.wifi.STATE_CHANGE"/> 
</intent-filter> 

nel tag ricevitore.

Oppure, se si desidera un maggiore controllo su di esso, prima di registrare BroadcastReceiver impostare questi in su:

final IntentFilter filters = new IntentFilter(); 
filters.addAction("android.net.wifi.WIFI_STATE_CHANGED"); 
filters.addAction("android.net.wifi.STATE_CHANGE"); 
super.registerReceiver(yourReceiver, filters); 

WIFI_STATE_CHANGED

Broadcast azione intenti che indica che la connessione Wi-Fi è stato attivato, disattivato, permettendo, disabilitante o sconosciuto. Un extra fornisce questo stato come int. Un altro extra fornisce lo stato precedente, se disponibile.

STATE_CHANGE

Broadcast azione intenti che indica che lo stato di connettività Wi-Fi è cambiato. Un altro fornisce il nuovo stato sotto forma di un oggetto NetworkInfo. Se il nuovo stato è COLLEGATO, ulteriori extra possono fornire il BSSID e il WifiInfo del punto di accesso. come String

Inoltre, è necessario specificare le autorizzazioni di destra all'interno del tag "manifesto":

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

per verificare la connettività, è possibile utilizzare ConnectivityManager, come ci dice che tipo di connessione è disponibile.

ConnectivityManager conMngr = (ConnectivityManager)this.getSystemService(this.CONNECTIVITY_SERVICE); 
android.net.NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
android.net.NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
+1

possiamo anche aggiungere un ricevitore broadcast per controllare il collegamento dati? – tasomaniac

+0

Potresti essere un po 'più preciso ... – nullpotent

+2

Penso che questo ci dia solo le modifiche di connessione nell'adattatore WIFI. Voglio essere avvisato quando la connessione dati mobile è cambiata. – tasomaniac

5

Questo è quello che faccio per essere avvisato quando il collegamento è cambiato. Si definisce un BroadCastReceiver per ricevere la trasmissione.

public class NetworkChangeReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
     NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

     boolean isConnected = wifi != null && wifi.isConnectedOrConnecting() || 
      mobile != null && mobile.isConnectedOrConnecting(); 
     if (isConnected) { 
      Log.d("Network Available ", "YES"); 
     } else { 
      Log.d("Network Available ", "NO"); 
     } 
    } 
} 

Devi anche definire BroadCast nel tuo manifest e filtrare per ConnectivityChange.

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

Fonte here

+0

Per favore, considera che partire con Android N la trasmissione 'android.net.conn.CONNECTIVITY_CHANGE" 'è deprecata.La documentazione suggerisce di usare' JobScheduler' o 'GCMNetworkManager' –

+1

@Nicholas non è deprecato. Devi solo creare la trasmissione ricevitore all'interno del codice, non nel file manifest. –

0

Per completare @ risposta di Dantalian. A partire da Android Nougat non devi dichiarare il tuo ricevitore sul tuo manifest perché non riceverà la trasmissione CONNECTIVITY_ACTION. Dovresti invece registrare il tuo ricevitore usando il metodo Context.registerReceiver(Receiver, Intent).

Link alla fonte here

Problemi correlati