2010-02-19 8 views
38

Ich brauche Broadcasts für Netzwerkaktionen wie Netzwerk verbunden, getrennt usw. Ich verwende einen Broadcast-Empfänger für diesen Zweck. Kann mir bitte jemand sagen, welche Absicht Aktion ich für Netzwerkereignisse erfassen muss, gerade jetzt nach meiner Suche im Internet verwende ich android.net.ConnectivityManager.CONNECTIVITY_ACTION.Absicht Aktion für Netzwerkereignisse in android SDK

Hier ist meine Rundfunkempfänger Klasse:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class NetworkStateReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 


    if (intent.getAction().equals(
      android.net.ConnectivityManager.CONNECTIVITY_ACTION)) { 

     // do something.. 
    } 
} 
} 

und ich habe auch die Erlaubnis für den Zugriff auf Netzwerkstatus hinzugefügt:

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

hier ist, wie ich diese Klasse in Manifest-Datei

erklärt haben,
<receiver class=".NetworkStateReceiver" android:name=".NetworkStateReceiver"> 
    <intent-filter> 
      <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> 
    </intent-filter> 
</receiver> 

Bitte schlagen Sie mir die richtige Absicht vor, wenn ich falsch liege ODER wenn es anders geht Netzwerkereignisse abfangen.

Antwort

51

Hier ist ein funktionierendes Beispiel:

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

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

.

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(ConnectivityReceiver.class.getSimpleName(), "action: " 
       + intent.getAction()); 
    } 

} 
+0

Nach meinem Test Ich brauche keine Erlaubnis, Empfangen Sie Broadcasts, ob Wlan jetzt auf/ab ist oder 3g ist jetzt auf/ab. Ich bin ein wenig verwirrt, was ist android.net.conn.CONNECTIVITY_CHANGE dann gut? –

+0

Wenn Sie noch einmal schauen, werden Sie sehen, dass die CONNECTIVITY_CHANGE keine Berechtigung ist, sie registriert einen Intent-Empfänger (den Sie alternativ im Code ausführen können). – Hamid

+0

Die Antwort sieht genauso aus wie die Frage. Warum hat es vor der Antwort NICHT funktioniert? –

5

Yanchenko Antwort sehr nützlich ist, ich ein wenig bin gerade vereinfacht den Verbindungsstatus zu erhalten, ändern Sie bitte OnReceive wie folgt:

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(ConnectivityReceiver.class.getSimpleName(), "action: " 
       + intent.getAction()); 
     MyConstants.IS_NETWORK_AVAILABLE = haveNetworkConnection(context); 
     //IS_NETWORK_AVAILABLE this variable in your activities to check networkavailability. 

    } 


    private boolean haveNetworkConnection(Context context) { 
     boolean haveConnectedWifi = false; 
     boolean haveConnectedMobile = false; 

     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 
     for (NetworkInfo ni : netInfo) { 
      if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
       if (ni.isConnected()) 
        haveConnectedWifi = true; 
      if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
       if (ni.isConnected()) 
        haveConnectedMobile = true; 
     } 
     return haveConnectedWifi || haveConnectedMobile;  
    } 
} 
+0

bei Ravi K Sharma, wissen Sie von android.net.ConnectivityManager.EXTRA_NO_CONNECTIVITY? Das ist ein zusätzlicher Boolescher Wert in den Intent-Extras seit der API-Stufe 1, der angibt, ob eine Verbindung besteht oder nicht. –

+1

In Bezug auf den gestrigen Kommentar bemerkte ich, dass es nicht präzise war. Es scheint, dass EXTRA_NO_CONNECTIVITY, zumindest unter bestimmten Umständen, nur zu den Intent-Extras hinzugefügt wird, wenn keine Konnektivität besteht. Der Zugriff auf getBooleanExtra (ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) sollte also einen booleschen Wert ergeben, der wahr ist, wenn überhaupt keine Konnektivität vorhanden ist, und false, wenn Konnektivität besteht. Außerdem ist der Code in dieser Antwort ein ** Anti-Muster **, da die Analyse begrenzt ist. Bluetooth-Tethering, USB-Tethering oder LAN-Verbindungen werden nicht erkannt. Tu das nicht. –

+2

Zuordnung für diesen Code, da Ravi es vergessen hat: http://StackOverflow.com/a/4239410/182653 – paulw1128