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 zur Verbindungsstatus und den Funktionen der aktuell verbundenen Netzwerk. Mit der API können Sie feststellen, ob das Gerät derzeit die mit einem Netzwerk verbunden sind, 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.

Ein NetworkRequest deklarieren, das die Anforderungen an die Netzwerkverbindung Ihrer App beschreibt. Mit dem folgenden Code wird ein für ein Netzwerk anfordern, das mit dem Internet verbunden ist und entweder ein WLAN verwendet oder eine Mobilfunkverbindung auswählen.

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 erheblich teurer sein können als andere (für Beispiel: Mobilfunkverbindung ist in der Regel teuer. Verwenden Sie NetworkCapabilities#NET_CAPABILITY_NOT_METERED um zu ermitteln, 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 du die NetworkRequest bei der ConnectivityManager registrierst, musst du eine NetworkCallback um Benachrichtigungen über Änderungen des Verbindungsstatus und des Netzwerks zu erhalten Funktionen.

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

  • 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() bedeutet, dass die Verbindung des Geräts zum Netzwerk unterbrochen wurde.
  • onCapabilitiesChanged() zeigt an, dass sich die Funktionen des Netzwerks geändert haben. Die Objekt NetworkCapabilities liefert Informationen über die 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 Sie NetworkRequest und NetworkCallback deklariert haben, verwenden Sie die Funktionen requestNetwork() oder registerNetworkCallback(), um nach einem Netzwerk zu suchen, mit dem sich das Gerät verbinden lässt und das den NetworkRequest-Anforderungen entspricht. 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);