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

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

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

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

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

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

Котлин

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

Ява

NetworkRequest networkRequest = new NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .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)
    }
}

Ява

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)

Ява

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