Verbindungsstatus und Verbindungsmessung überwachen

Die ConnectivityManager bietet eine API, mit der Sie anfordern können, dass das Gerät basierend auf verschiedenen Bedingungen eine Verbindung zu einem Netzwerk herstellt. Dazu gehören Gerätefunktionen und Datenübertragungsoptionen.

Die Callback-Implementierung stellt Ihrer App Informationen zum Verbindungsstatus des Geräts sowie zu den Funktionen des derzeit verbundenen Netzwerks zur Verfügung. Mit der API können Sie feststellen, ob das Gerät derzeit mit einem Netzwerk verbunden ist, das die Anforderungen Ihrer App erfüllt.

Netzwerkanfrage konfigurieren

Wenn Sie den Transporttyp des Netzwerks (z. B. WLAN oder Mobilfunkverbindung) und die Funktionen des aktuell verbundenen Netzwerks (z. B. Internetverbindung) angeben möchten, müssen Sie eine Netzwerkanfrage konfigurieren.

Deklariere einen NetworkRequest, der die Anforderungen deiner App an die Netzwerkverbindung beschreibt. Mit dem folgenden Code wird eine Anfrage für ein Netzwerk erstellt, das mit dem Internet verbunden ist und entweder eine WLAN- oder Mobilfunkverbindung als Transporttyp verwendet.

Kotlin

val networkRequest = NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .build()

Java

NetworkRequest networkRequest = new NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .build();

Beachten Sie, dass einige Verbindungen deutlich teurer sein können als andere. Beispielsweise ist eine Mobilfunkverbindung in der Regel teuer. Mit NetworkCapabilities#NET_CAPABILITY_NOT_METERED können Sie feststellen, ob die Verbindung teuer ist. Wenn Sie eine getaktete Verbindung nutzen, versuchen Sie, den Datenverbrauch Ihrer App zu reduzieren oder verzögern Sie die Datenübertragung, bis das Gerät eine Verbindung ohne Datenlimit hat.

Netzwerk-Callback konfigurieren

Wenn Sie die NetworkRequest beim ConnectivityManager registrieren, müssen Sie einen NetworkCallback implementieren, um Benachrichtigungen zu Änderungen des Verbindungsstatus und der Netzwerkfunktionen zu erhalten.

Zu den am häufigsten implementierten Funktionen in NetworkCallback gehören:

  • onAvailable() weist darauf hin, dass das Gerät mit einem neuen Netzwerk verbunden ist, das die in der NetworkRequest angegebenen Anforderungen an Funktionen und Transporttyp erfüllt.
  • onLost() gibt an, dass das Gerät keine Netzwerkverbindung mehr hat.
  • onCapabilitiesChanged() weist darauf hin, dass sich die Funktionen des Netzwerks geändert haben. Das NetworkCapabilities-Objekt enthält Informationen zu den aktuellen Funktionen des Netzwerks.

Kotlin

private val networkCallback = object : ConnectivityManager.NetworkCallback() {
    // network is available for use
    override fun onAvailable(network: Network) {
        super.onAvailable(network)
    }

    // Network capabilities have changed for the network
    override fun onCapabilitiesChanged(
            network: Network,
            networkCapabilities: NetworkCapabilities
    ) {
        super.onCapabilitiesChanged(network, networkCapabilities)
        val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
    }

    // lost network connection
    override fun onLost(network: Network) {
        super.onLost(network)
    }
}

Java

private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(@NonNull Network network) {
        super.onAvailable(network);
    }

    @Override
    public void onLost(@NonNull Network network) {
        super.onLost(network);
    }

    @Override
    public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
        super.onCapabilitiesChanged(network, networkCapabilities);
        final boolean unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
    }
};

Für Netzwerkupdates registrieren

Nachdem du NetworkRequest und NetworkCallback deklariert hast, kannst du mit den Funktionen requestNetwork() oder registerNetworkCallback() nach einem Netzwerk suchen, um eine Verbindung über das Gerät herzustellen, das die NetworkRequest erfüllt. Der Status wird dann an die NetworkCallback gesendet.

Kotlin

val connectivityManager = getSystemService(ConnectivityManager::class.java) as ConnectivityManager
connectivityManager.requestNetwork(networkRequest, networkCallback)

Java

ConnectivityManager connectivityManager =
        (ConnectivityManager) getSystemService(ConnectivityManager.class);
connectivityManager.requestNetwork(networkRequest, networkCallback);