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