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