← Назад к вопросам
Как проверить наличие сети
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)
}
}
Важные практические аспекты
- Кеширование 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
}
}
- Режим полета — влияет на все типы соединений
- Фоновые ограничения — начиная с Android 8.0 (API 26) есть ограничения на работу в фоне
- Metered сети — некоторые сети могут быть тарифицируемыми:
val isMetered = connectivityManager.isActiveNetworkMetered
- WorkManager и NetworkType — при планировании фоновых задач можно указать требуемый тип сети
Рекомендации по архитектуре
- Используйте реактивный подход через LiveData или Flow
- Инкапсулируйте логику проверки в отдельный компонент (NetworkMonitor)
- Учитывайте жизненный цикл компонентов (отписывайтесь от коллбэков)
- Для Kotlin-разработки рассмотрите библиотеки типа
androidx.core:core-ktx, содержащие extension-функции
Правильная проверка сети улучшает UX, снижает расход трафика и повышает надежность приложения. Всегда тестируйте сценарии с переключением между Wi-Fi, мобильным интернетом и режимом полета.