NetworkCallback ist eine abstrakte Klasse im Android SDK zur Überwachung von Netzwerkzustandsänderungen über ConnectivityManager. Laut Android Developers Documentation (2025) ermöglicht die Verwendung von NetworkCallback Ihrer App, zeitnah auf Verbindung, Trennung oder Änderungen der Verbindungseigenschaften zu reagieren. ConnectivityManager.NetworkCallback liefert detaillierte Informationen über Netzwerktyp, Captive Portale und Internetverlust, ohne den Systemdienst ständig abfragen zu müssen.
Wichtige Punkte
NetworkCallback ist eine abstrakte Klasse aus dem Paket android.net, die Teil des Android SDK ist. Sie wurde entwickelt, um Benachrichtigungen über Änderungen des Netzwerkverbindungsstatus über den Systemdienst ConnectivityManager zu erhalten.
Vor NetworkCallback verwendeten Entwickler BroadcastReceiver, um Netzwerkänderungen zu verfolgen. Dieser Ansatz erforderte eine ständige Manifest-Registrierung, arbeitete mit Verzögerungen und lieferte keine detaillierten Informationen über Verbindungseigenschaften. Android 5.0 (API 21) führte NetworkCallback als flexiblere und leistungsfähigere Alternative ein.
Der Callback arbeitet asynchron: Die App abonniert Ereignisse über ConnectivityManager, und das System ruft die Callback-Methoden auf, wenn sich der Netzwerkzustand ändert. Dies macht regelmäßiges Polling des Netzwerkstatus überflüssig und spart Batterie- und CPU-Ressourcen.
ConnectivityManager verwaltet alle Netzwerkschnittstellen des Geräts — Wi-Fi, mobile Daten, Ethernet, VPN. Wenn sich eine dieser Schnittstellen ändert, erstellt das System ein Network-Objekt und übergibt es an die entsprechende Methode des registrierten Callbacks. Jedes Network hat eine eindeutige Kennung, die sich bei einer erneuten Verbindung ändert.
Der Callback ist nicht an einen bestimmten Netzwerktyp gebunden — er kann alle verfügbaren Schnittstellen gleichzeitig verfolgen. Zum Filtern von Verbindungstypen wird die Klasse NetworkRequest verwendet, die die erforderlichen Transportprotokolle (Wi-Fi, Mobilfunkdaten, Ethernet) und Netzwerkfähigkeiten angibt.
Die NetworkCallback-Registrierung erfolgt über die Methode ConnectivityManager.registerNetworkCallback. Der erste Parameter ist ein NetworkRequest.Builder, der die Netzwerkanforderungen beschreibt, der zweite eine Callback-Instanz. Die Berechtigung ACCESS_NETWORK_STATE ist im Manifest erforderlich.
class NetworkMonitor(private val context: Context) {
private val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE)
as ConnectivityManager
private val callback =
object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
Log.d("Network", "Available: ${network}")
}
override fun onLost(network: Network) {
Log.d("Network", "Lost: ${network}")
}
}
fun register() {
connectivityManager.registerNetworkCallback(
NetworkRequest.Builder().build(), callback
)
}
fun unregister() {
connectivityManager.unregisterNetworkCallback(callback)
}
}
Es wird empfohlen, NetworkCallback zu registrieren, wenn die App im Vordergrund ist, und sie aufzuheben, wenn sie in den Hintergrund geht. In Activity verwenden Sie onStart und onStop zur Verwaltung des Callback-Lebenszyklus. In Fragment verwenden Sie onResume und onPause.
Zur Vereinfachung der Registrierungsverwaltung können Sie Lifecycle-aware-Komponenten verwenden. Die Bibliothek AndroidX Lifecycle ermöglicht die Erstellung eines benutzerdefinierten LifecycleObservers, der den Callback automatisch registriert und aufhebt, wenn sich der Lebenszyklusstatus ändert.
Für Hintergrundaufgaben erfolgt die Registrierung in einem Service oder WorkManager. Beachten Sie, dass Hintergrunddienste unter Android 8+ Startbeschränkungen haben. WorkManager mit NetworkType ist eine zuverlässigere Möglichkeit, Aufgaben unter einem bestimmten Netzwerkzustand auszuführen, da er mit der Kompatibilitäts-API integriert ist und den Doze-Modus berücksichtigt.
NetworkCallback bietet eine Reihe von Methoden, die bei Änderung des Netzwerkzustands aufgerufen werden. Nicht alle Methoden müssen überschrieben werden — implementieren Sie nur die, die für Ihre spezifische App-Aufgabe erforderlich sind. onAvailable und onLost sind das Minimum für die grundlegende Verbindungsüberwachung.
| Methode | Wann aufgerufen | Parameter |
|---|---|---|
| onAvailable | Netzwerk ist verfügbar | Network — Netzwerkobjekt |
| onLost | Netzwerk verloren oder getrennt | Network — Netzwerkobjekt |
| onCapabilitiesChanged | Netzwerkfähigkeiten geändert | Network, NetworkCapabilities |
| onBlockedStatusChanged | Blockierstatus geändert | Network, Boolean |
| onNetworkSuspended | Netzwerk vom System ausgesetzt | Network |
| onNetworkResumed | Netzwerk nach Aussetzung fortgesetzt | Network |
Diese Methode ist der Schlüssel zum Erhalten detaillierter Netzwerkinformationen. Der Parameter NetworkCapabilities enthält Flags: NET_CAPABILITY_INTERNET — Internetzugang verfügbar, NET_CAPABILITY_NOT_METERED — unbegrenzte Verbindung, NET_CAPABILITY_NOT_ROAMING — kein Roaming. Auch Signallatenz und Bandbreite sind abrufbar.
Captive Portale sind ein Sonderfall: Bei der Verbindung mit einem öffentlichen Wi-Fi-Netzwerk über ein Portal zeigt die Methode onCapabilitiesChanged nicht sofort INTERNET an. Das Netzwerk ist zunächst verfügbar, aber ohne Internet — eine Autorisierung über den Browser ist erforderlich. Entwickler müssen diese Verzögerung in der App-Logik berücksichtigen.
Wird aufgerufen, wenn das System den Netzwerkverkehr für die App blockiert — zum Beispiel bei Aktivierung des Datensparmodus oder Einschränkung von Hintergrunddaten. onBlockedStatusChanged teilt der App mit, dass ihre Netzwerkanfragen vorübergehend verboten sind, und wechselt zur lokalen Verarbeitung.
Betrachten wir eine praktische NetworkCallback-Implementierung zur Überwachung des Internetzugangs und zur Behandlung von Captive Portalen. Das folgende Beispiel zeigt die Überprüfung von NET_CAPABILITY_INTERNET und die Validierung der Verbindung über eine HTTP-Anfrage an den Google-Server.
val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onCapabilitiesChanged(
network: Network,
caps: NetworkCapabilities
) {
val hasInternet = caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_INTERNET
)
val isMetered = caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_NOT_METERED
).not()
when {
hasInternet && isMetered ->
Log.d("Network", "Mobile data connected")
hasInternet ->
Log.d("Network", "Wi-Fi connected")
else ->
Log.d("Network", "No internet access")
}
}
override fun onLost(network: Network) {
Log.d("Network", "Connection lost: ${network}")
// Netzwerkanfragen stoppen
}
}
Bei der Verbindung mit einem öffentlichen Netzwerk mit Autorisierung (Café, Flughafen) meldet das System zunächst onAvailable, aber onCapabilitiesChanged zeigt möglicherweise kein INTERNET an. In solchen Fällen ist eine zusätzliche Überprüfung über eine HTTP-Anfrage an einen stabilen Endpunkt wie https://www.google.com/generate_204 erforderlich.
Wenn die Anfrage den Code 204 zurückgibt — ist Internet verfügbar. Bei einer Weiterleitung (301, 302, 307) — ist Browser-Autorisierung erforderlich. In diesem Fall können Sie ein WebView oder Intent mit der Weiterleitungs-URL öffnen, um die Portal-Authentifizierung abzuschließen.
fun Context.validateInternet(network: Network) {
CoroutineScope(Dispatchers.IO).launch {
try {
val url = URL("https://www.google.com/generate_204")
val connection =
network.openConnection(url) as HttpURLConnection
connection.instanceFollowRedirects = false
connection.connect()
when (connection.responseCode) {
HttpURLConnection.HTTP_NO_CONTENT ->
Log.d("Network", "Internet is available")
in HttpURLConnection.HTTP_MOVED_PERM
..HttpURLConnection.HTTP_TEMP_REDIRECT ->
Log.d("Network", "Captive portal detected")
}
connection.disconnect()
} catch (e: Exception) {
Log.e("Network", "Validation failed: ${e.message}")
}
}
}
Vor NetworkCallback war die primäre Methode zur Netzwerküberwachung BroadcastReceiver mit dem Filter android.net.conn.CONNECTIVITY_CHANGE. Dieser Ansatz hatte erhebliche Nachteile: Verzögerungen von mehreren Sekunden, fehlende Informationen über den Schnittstellentyp und erhöhter Stromverbrauch durch ständiges Aufwecken des Geräts.
Eine moderne Alternative ist LiveData oder StateFlow in Kombination mit NetworkCallback. Das Muster besteht darin, den Callback in einen reaktiven Stream zu verpacken, der die UI automatisch über Zustandsänderungen benachrichtigt. Beispielsweise wird ein MutableStateFlow mit dem Typ NetworkStatus innerhalb der Callback-Methoden aktualisiert, und ein ViewCollector abonniert die Änderungen.
| Methode | API Level | Latenz | Detailgrad | Stromverbrauch |
|---|---|---|---|---|
| BroadcastReceiver | 1+ | hoch | niedrig | hoch |
| NetworkCallback | 21+ | niedrig | hoch | niedrig |
| ConnectivityManager.getActiveNetwork | 23+ | sofort | mittel | keiner |
| NWPathMonitor (iOS) | iOS 12+ | niedrig | hoch | niedrig |
Ab Android 10 sind die Hintergrundbeschränkungen strenger, und NetworkCallback wird möglicherweise nicht aufgerufen, wenn die App im Hintergrund ist. Für kritische Aufgaben — wie Daten laden, wenn das Netzwerk verfügbar wird — verwenden Sie WorkManager mit der Einschränkung NetworkType.CONNECTED. WorkManager garantiert die Aufgabenausführung bei Erfüllung der Netzwerkbedingungen.
In Android 12+ gibt es eine Einschränkung für die Manifest-Registrierung von BroadcastReceiver für CONNECTIVITY_ACTION. Entwickler müssen auf NetworkCallback migrieren oder WorkManager verwenden. Die Google Play-Richtlinie verlangt seit August 2022 die Entfernung der Manifest-Registrierung für diese Aktion.
Häufig gestellte Fragen
BroadcastReceiver mit CONNECTIVITY_CHANGE liefert nur die Tatsache der Netzwerkänderung ohne Details und mit einer Verzögerung von bis zu mehreren Sekunden. NetworkCallback arbeitet asynchron, liefert ein Network-Objekt, Schnittstellentyp und Verbindungsfähigkeiten und benötigt keine Manifest-Registrierung, die unter Android 12+ verboten ist.
Unter Android 10+ können Hintergrundbeschränkungen den Aufruf von NetworkCallback verzögern oder verhindern. Für Hintergrundaufgaben verwenden Sie WorkManager mit NetworkType-Einschränkung — er garantiert die Aufgabenausführung bei Erfüllung der Bedingungen, unabhängig vom Energiesparmodus.
Rufen Sie die Methode unregisterNetworkCallback bei ConnectivityManager auf und übergeben Sie dieselbe Callback-Instanz, die Sie bei der Registrierung verwendet haben. Ein nicht aufgehobener Callback kann zu Speicherlecks führen, da das System eine Referenz darauf behält. Heben Sie die Registrierung immer in onStop oder onDestroy auf.
NetworkCallback ist ab API Level 21 (Android 5.0 Lollipop) verfügbar. Für Geräte mit älteren Versionen verwenden Sie BroadcastReceiver oder Kompatibilitätsbibliotheken wie AndroidX Activity NetworkCallback, die die API für breitere Unterstützung kapseln.
Verwenden Sie ConnectivityManager.getActiveNetwork (API 23+) zusammen mit getNetworkCapabilities. Die Methode gibt das aktuelle aktive Netzwerk synchron zurück, ohne Änderungen zu abonnieren. Für API 21-22 verwenden Sie getActiveNetworkInfo, das in neueren Versionen als veraltet markiert ist.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch