← Назад к вопросам

Как проверить наличие сети

1.0 Junior🔥 191 комментариев
#Android компоненты#Сетевое взаимодействие

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Проверка наличия сети на Android

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

Использование ConnectivityManager

Основной класс для работы с сетевым состоянием — ConnectivityManager. Он предоставляет информацию о текущих сетевых подключениях (Wi-Fi, мобильные данные и т.д.).

fun isNetworkAvailable(context: Context): Boolean {
    val connectivityManager = context.getSystemService(
        Context.CONNECTIVITY_SERVICE
    ) as ConnectivityManager
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val network = connectivityManager.activeNetwork
        val networkCapabilities = connectivityManager
            .getNetworkCapabilities(nobwork)
        return networkCapabilities?.hasCapability(
            NetworkCapabilities.NET_CAPABILITY_INTERNET
        ) == true
    } else {
        @Suppress("DEPRECATION")
        val networkInfo = connectivityManager.activeNetworkInfo
        return networkInfo?.isConnectedOrConnecting == true
    }
}

Важные нюансы:

  • Для Android 6.0+ (API 23+) используйте NetworkCapabilities
  • Для более старых версий — NetworkInfo (устаревший с API 29)
  • Требуются разрешения в манифесте:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Проверка конкретного типа сети

Иногда нужно определить, доступен ли Wi-Fi или мобильный интернет:

fun getNetworkType(context: Context): String {
    val connectivityManager = context.getSystemService(
        Context.CONNECTIVITY_SERVICE
    ) as ConnectivityManager
    
    val networkCapabilities = connectivityManager
        .getNetworkCapabilities(connectivityManager.activeNetwork)
    
    return when {
        networkCapabilities?.hasTransport(
            NetworkCapabilities.TRANSPORT_WIFI
        ) == true -> "Wi-Fi"
        networkCapabilities?.hasTransport(
            NetworkCapabilities.TRANSPORT_CELLULAR
        ) == true -> "Cellular"
        else -> "Unknown or no network"
    }
}

Слушатель изменений сетевого состояния

Для динамического отслеживания подключений используйте NetworkCallback:

class NetworkMonitor(private val context: Context) {
    private val connectivityManager = context.getSystemService(
        Context.CONNECTIVITY_SERVICE
    ) as ConnectivityManager
    
    private val networkCallback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            // Сеть стала доступна
        }
        
        override fun onLost(network: Network) {
            // Соединение потеряно
        }
    }
    
    fun registerNetworkCallback() {
        connectivityManager.registerDefaultNetworkCallback(networkCallback)
    }
    
    fun unregisterNetworkCallback() {
        connectivityManager.unregisterNetworkCallback(networkCallback)
    }
}

Важные практические аспекты

  1. Кеширование DNS — наличие сети не гарантирует реального доступа в интернет. Можно дополнительно проверить доступность конкретного хоста:
suspend fun isInternetAvailable(): Boolean {
    return try {
        withTimeout(3000) {
            val url = URL("https://connectivitycheck.gstatic.com/generate_204")
            val connection = url.openConnection() as HttpURLConnection
            connection.connectTimeout = 1500
            connection.readTimeout = 1500
            connection.connect()
            connection.responseCode == 204
        }
    } catch (e: Exception) {
        false
    }
}
  1. Режим полета — влияет на все типы соединений
  2. Фоновые ограничения — начиная с Android 8.0 (API 26) есть ограничения на работу в фоне
  3. Metered сети — некоторые сети могут быть тарифицируемыми:
val isMetered = connectivityManager.isActiveNetworkMetered
  1. WorkManager и NetworkType — при планировании фоновых задач можно указать требуемый тип сети

Рекомендации по архитектуре

  • Используйте реактивный подход через LiveData или Flow
  • Инкапсулируйте логику проверки в отдельный компонент (NetworkMonitor)
  • Учитывайте жизненный цикл компонентов (отписывайтесь от коллбэков)
  • Для Kotlin-разработки рассмотрите библиотеки типа androidx.core:core-ktx, содержащие extension-функции

Правильная проверка сети улучшает UX, снижает расход трафика и повышает надежность приложения. Всегда тестируйте сценарии с переключением между Wi-Fi, мобильным интернетом и режимом полета.