Отслеживание состояния подключения и измерения количества подключений

ConnectivityManager предоставляет API, позволяющий запрашивать подключение устройства к сети на основе различных условий, включая возможности устройства и параметры передачи данных.

Реализация функции обратного вызова предоставляет вашему приложению информацию о состоянии подключения устройства, а также о возможностях текущей подключенной сети. API позволяет определить, подключено ли устройство в данный момент к сети, удовлетворяющей требованиям вашего приложения.

Настройте сетевой запрос

Для указания типа сетевого соединения, например, Wi-Fi или сотовой связи, а также возможностей подключенной сети, например, подключения к интернету, необходимо настроить сетевой запрос.

Объявите объект NetworkRequest , описывающий потребности вашего приложения в сетевом подключении. Приведенный ниже код создает запрос к сети, подключенной к интернету, и использует Wi-Fi, Ethernet или сотовую связь в качестве типа транспортного протокола.

Котлин

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

Java

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

Обратите внимание, что некоторые соединения могут быть значительно дороже других (например, мобильное соединение обычно дорогое). Используйте NetworkCapabilities#NET_CAPABILITY_NOT_METERED чтобы определить, является ли соединение дорогим. При использовании лимитированного соединения постарайтесь уменьшить потребление данных вашим приложением или отложите его использование до тех пор, пока устройство не перейдет на бесплатное соединение.

Настройте сетевой обратный вызов.

При регистрации объекта NetworkRequest в ConnectivityManager необходимо реализовать компонент NetworkCallback для получения уведомлений об изменениях состояния соединения и сетевых возможностей.

К наиболее часто используемым функциям в NetworkCallback относятся следующие:

  • onAvailable() указывает, что устройство подключено к новой сети, которая удовлетворяет требованиям к возможностям и типу транспорта, указанным в NetworkRequest .
  • onLost() указывает на то, что устройство потеряло связь с сетью.
  • onCapabilitiesChanged() указывает на изменение возможностей сети. Объект NetworkCapabilities предоставляет информацию о текущих возможностях сети.

Котлин

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);
    }
};

Зарегистрируйтесь для получения обновлений сети.

После объявления объектов NetworkRequest и NetworkCallback используйте функции requestNetwork() или registerNetworkCallback() для поиска сети для подключения с устройства, удовлетворяющей NetworkRequest . Затем статус сети передается в NetworkCallback .

Котлин

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

Java

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