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