it-swarm.com.de

Beispiel für einen Internet-Listener von Android

Ich arbeite an einer Android-App, die ständig mit dem Internet verbunden bleibt. Wenn das Internet verfügbar ist, sollte es eine entsprechende Nachricht an den Benutzer senden.

Gibt es so etwas wie Internet Listener? Oder wie Sie dieses Ereignis so implementieren, dass es eine Warnung gibt, wenn keine Internetverbindung verfügbar ist.

25

Erstellen Sie dafür einen Broadcast-Empfänger und registrieren Sie ihn in der Manifest-Datei.

Erstellen Sie zuerst eine neue Klasse NetworkStateReceiver und erweitern Sie BroadcastReceiver.

public class NetworkStateReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
     Log.d("app","Network connectivity change");
     if(intent.getExtras()!=null) {
        NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
        if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) {
            Log.i("app","Network "+ni.getTypeName()+" connected");
        }
     }
     if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) {
            Log.d("app","There's no network connectivity");
     }
   }
}

Fügen Sie diesen Code in Ihre AndroidManifest.xml unter dem Element "application" ein:

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

Und fügen Sie diese Erlaubnis hinzu

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

EDIT

Dieser Code erkennt nur Verbindungsänderungen, kann jedoch nicht feststellen, ob das Netzwerk, mit dem er verbunden ist, über einen Internetzugang verfügt. Verwenden Sie diese Methode, um das zu überprüfen -

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 200);
        } catch (IOException e) {
        Log.e(LOG_TAG, "Error checking internet connection", e);
        }
    } else {
    Log.d(LOG_TAG, "No network available!");
    }
    return false;
}
49
Chirag

Der oben genannte Code von Chirag Raval funktioniert sicherlich. Das Problem ist, dass der Listener auch dann aufgerufen wird, wenn die Anwendung nicht im Vordergrund ausgeführt wird. 

IMHO ist der bessere Ansatz, den Empfänger in den onResume()/onPause()-Methoden aller Ihrer Anwendungsaktivitäten zu registrieren/abmelden. Dieser Code sollte es tun:

private final NetworkStateReceiver stateReceiver = new NetworkStateReceiver();

@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction("Android.net.conn.CONNECTIVITY_CHANGE");
    registerReceiver(stateReceiver, filter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(stateReceiver);
}

Offensichtlich entfernen Sie die Registrierung aus der AndroidManifest.xml-Datei.

Mit dieser Lösung wird der Empfänger auch aufgerufen, wenn zwischen den Aktivitäten Ihrer Anwendung gewechselt wird (vorausgesetzt, Sie schließen sie). Verwenden Sie in einem solchen Fall ein statisches Flag (das von allen Ihren Aktivitäten verwendet wird) wie im folgenden Beispiel (genannt online):

public class NetworkStateReceiver extends BroadcastReceiver {

    private static boolean online = true;  // we expect the app being online when starting

    public static final String TAG = NetworkStateReceiver.class.getSimpleName();

    public void onReceive(Context context, Intent intent) {
        Log.d(TAG,"Network connectivity change");
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = manager.getActiveNetworkInfo();
        if (ni == null || ni.getState() != NetworkInfo.State.CONNECTED) {
            Log.d(TAG,"There's no network connectivity");
            if (online) // don't show the message if already offline
                Toast.makeText(context, R.string.noInternet, Toast.LENGTH_SHORT).show();
            online = false;
        } else {
            Log.d(TAG,"Network "+ni.getTypeName()+" connected");
            if (!online)  // don't show the message if already online
                Toast.makeText(context, R.string.backOnline, Toast.LENGTH_SHORT).show();
            online = true;
        }
    }
}

Wenn Sie Ihre App im Offline-Modus starten, wird die Toast-Meldung angezeigt. Andernfalls wird es nur angezeigt, wenn die Verbindung unterbrochen/wiederhergestellt wird.

1
pepan