2012-05-24 3 views
27

J'ai commencé à développer une application qui mettra à jour la base de données chaque fois que le téléphone est connecté au WiFi. J'ai mis en œuvre un Service et BroadcastReceiver qui va exécuter le Service (il me dira quel réseau est utilisé), mais le problème est que je ne sais pas quoi ajouter dans le fichier manifeste pour commencer BroadcastReceiver lorsque l'état du réseau change ou quand il se connecte à une sorte de réseauBroadcastReceiver lorsque l'état du réseau wifi ou 3g a changé

Merci.

Répondre

57

Vous voulez

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

Dans votre balise de récepteur.

Ou si vous voulez plus de contrôle sur elle, avant de vous inscrire BroadcastReceiver configurer ces:

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

une action intention de diffusion indiquant qui a été activé Wi-Fi, les personnes handicapées, ce qui permet, désactivant, ou inconnu. Un extra fournit cet état en tant qu'int. Un autre extra fournit l'état précédent, si disponible.

STATE_CHANGE

une action de diffusion intention indiquant que l'état de la connectivité Wi-Fi a changé. Un supplémentaire fournit le nouvel état sous la forme d'un objet NetworkInfo. Si le nouvel état est CONNECTED, des extras supplémentaires peuvent fournir le BSSID et le WifiInfo du point d'accès. en tant que chaîne

En outre, vous devrez spécifier les autorisations à l'intérieur tag « manifeste »:

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

Pour vérifier la connectivité, vous pouvez utiliser ConnectivityManager comme il vous indique quel type de connexion est disponible.

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

Peut-on ajouter également un récepteur de radiodiffusion pour vérifier la connexion de données? – tasomaniac

+0

Pourriez-vous être un peu plus précis ... – nullpotent

+2

Je pense que cela ne nous donne que les changements de connexion dans l'adaptateur WIFI. Je veux être informé lorsque la connexion de données mobiles a changé. – tasomaniac

5

Voici ce que je fais pour être averti quand a modifié la connexion. Vous définissez un BroadCastReceiver pour recevoir la diffusion.

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

Vous devez également définir cette diffusion BroadCast dans votre manifeste et filtrer par ConnectivityChange.

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

Source here

+0

Veuillez noter qu'à partir de Android N, la diffusion 'android.net.conn.CONNECTIVITY_CHANGE" 'est obsolète, la documentation suggère d'utiliser' JobScheduler' ou 'GCMNetworkManager' –

+1

@Nicholas ce n'est pas obsolète. récepteur dans le code, pas dans le fichier manifeste. –

0

Pour compléter la réponse de @ Dantalian. À partir de Android Nougat, vous ne devez pas déclarer votre récepteur sur votre manifeste car il ne recevra pas la diffusion CONNECTIVITY_ACTION. Vous devriez plutôt enregistrer votre récepteur en utilisant la méthode Context.registerReceiver(Receiver, Intent).

Lien vers la source here

Questions connexes