과거 방식: NetworkInfo → 이제는 ❌
예전 사용법
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo = cm.activeNetworkInfo
val isConnected = networkInfo?.isConnectedOrConnecting == true
하지만 이 방식은 API 29(Android 10) 부터 deprecated
- 단순히 연결 유무만 알 수 있고, 인터넷 실제 연결 상태는 확인 불가
- ex) Wi-Fi는 연결되었지만 인터넷이 안 터지는 경우에도 true로 찍힘,,
- Android의 Doze Mode, App Standby, VPN, 제한 네트워크 등 새로운 개념을 반영 못 함
→ 더 정확한 NetworkCapabilities 기반 방식으로 변경됨
NetworkCapabilities
실제로 인터넷 연결 가능한지 확인
fun isNetworkAvailable(context: Context): Boolean {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network = connectivityManager.activeNetwork ?: return false
val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
}
- activeNetwork → 현재 기기에서 실제로 연결되어 있는 네트워크를 의미함
- hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)→ 그중에서도 "인터넷에 연결 가능한지" 여부를 확인하는 메서드
- getNetworkCapabilities(network) → 해당 네트워크가 지원하는 기능들(인터넷 가능 여부, Wi-Fi인지 등)을 확인 가능
네트워크 연결 변화 감지하는 방식 (callback 기반)
- 위에서의 기능은 함수를 실행하는 시점의 네트워크 연결 여부를 판단한다면,
이 callback은 네트워크 변화를 추적할 수 있음 !! 다만 콜백 해제에 유의해야함 !
val callback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
Log.d("Network", "인터넷 사용가능")
}
override fun onLost(network: Network) {
Log.d("Network", "인터넷 끊김")
}
}
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val request = NetworkRequest.Builder().build()
cm.registerNetworkCallback(request, callback)
'📱 Android' 카테고리의 다른 글
[Android] MVI 패턴, 이름을 왜이렇게 헷갈리게 지었어요? (0) | 2025.05.27 |
---|---|
[Android] WorkManager (0) | 2025.04.18 |
[Android] 클린 아키텍처 적용 시 고민했던 3가지 의문점 (0) | 2025.04.12 |
[Android / RecyclerView] onCreateViewHolder vs onBindViewHolder: 클릭 리스너는 어디에 둘까? (0) | 2025.04.07 |
[Android] LiveData - observeForever (0) | 2025.03.21 |