-
[Android] ConnectivityManager로 네트워크 상태 판단하기Android📱 2023. 9. 12. 22:52
스마트폰의 장점은 가볍게 들고 다닐 수 있고, 어디서든지 네트워크에 접속해서 내가 필요한 정보를 얻거나, 공유할 수 있는 접근성이라고 생각한다.
스마트폰이 없던 시절에는 공포의 네이트 버튼이 존재했는데

이 버튼을 누르는 순간 엄청난 요금 폭탄이;;
하지만 요즘은 무제한 요금제도 흔하고, OTT, SNS 그리고 흔한 거의 대부분의 앱들이 네트워크가 켜져있지 않으면 사용이 불가능한 경우가 많다.
그렇기 때문에 네이티브 개발자는 네트워크 상태를 판단하고, 현재 앱에서 네트워크를 사용할 수 있는지 없는지를 판단하고,
네트워크가 없을 경우 앱을 사용하지 못하게 할지 아니면 일정 부분만 사용을 못하게 할지 등 여러 가지 행동을 프로그래밍해놓을 수 있다.
ConnectivityManager
그렇다면 네트워크 상태를 어떻게 알 수 있을까?
간단하다.
우리 구글 형님들이 다해놓셨다...
ConnectivityManager를 사용하면 간단하게 현재 네트워크에 연결이 되어있는지 혹은 연결이 됐는지 끊어졌는지, 단말기가 네트워크 통신을 할 수 있는 상태인지까지 알 수 있다.
네트워크 정보도 얻어 올수 있다....
네트워크 상태 바로 가져오기
이 글에서 알아볼 것은 간단하게. 네트워크의 연결 상태만 알아보는 것만 정리해보려 한다.
우선 바로 상태를 가져오는 코드를 알아보자
val connectivityManager = getSystemService(ConnectivityManager::class.java) val currentNetwork = connectivityManager.activeNetworkgetSystemservice를 통해서 ConnectivityManager를 가져온다.
그리고 현재 활성화된 네트워크를 체크하면 되는데
연결이 되어있으면 currentNetwork에 Network 정보가 있고, 연결이 안 되어 있다면 null이 온다
이를 통해서 네트워크 정보를 가져올 수 있다.


만약에 위 화면처럼 특정 이벤트 때 가져오는 게 아니라 항상 감시를 해야 한다면 callback을 이용하면 된다.
connectivityManager.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network : Network) { Log.e(TAG, "The default network is now: $network") Toast.makeText(this@MainActivity, "네트워크에 연결됨", Toast.LENGTH_SHORT).show() } override fun onLost(network : Network) { Log.e(TAG, "The application no longer has a default network. The last default network was $network" ) Toast.makeText(this@MainActivity, "네트워크 없음", Toast.LENGTH_SHORT).show() } override fun onCapabilitiesChanged(network : Network, networkCapabilities : NetworkCapabilities) { Log.e(TAG, "The default network changed capabilities: $networkCapabilities") } override fun onLinkPropertiesChanged(network : Network, linkProperties : LinkProperties) { Log.e(TAG, "The default network changed link properties: $linkProperties") } })위 코드로 콜백을 걸어주면 네트워크가 연결될 때, 끊길 때 콜백이 오고 그때 하고 싶은 행위를 넣어주면 된다.
이 외에도
addDefaultNetworkActiveListener, isDefaultNetworkActive val caps = connectivityManager.getNetworkCapabilities(currentNetwork) val linkProperties = connectivityManager.getLinkProperties(currentNetwork)위와 같은 코드들로 데이터 -> wifi, wifi -> 데이터로 변경 또는 네트워크를 최대로 쓸 수 있는 상태인지, 네트워크의 정보 등 많은 데이터를 받을 수 있으니 필요한 부분을 찾아서 활용해 보면 좋을 거 같다.
참고
https://developer.android.com/training/basics/network-ops/reading-network-state
'Android📱' 카테고리의 다른 글
[Android] BottomSheetBehavior (0) 2023.10.19 안드로이드에서의 Clean Architecture와 Google Recommendation Architecture (1) 2023.10.11 키보드 이벤트 리스너 (0) 2023.08.29 [Android] Fragment viewLifecycleOwner와 lifecycle의 차이 (0) 2023.08.24 [Android] 공유하기 기능 만들기!! (0) 2023.08.23