ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] ConnectivityManager로 네트워크 상태 판단하기
    Android📱 2023. 9. 12. 22:52

    스마트폰의 장점은 가볍게 들고 다닐 수 있고, 어디서든지 네트워크에 접속해서 내가 필요한 정보를 얻거나, 공유할 수 있는 접근성이라고 생각한다.

     

    스마트폰이 없던 시절에는 공포의 네이트 버튼이 존재했는데

    이 버튼을 누르는 순간 엄청난 요금 폭탄이;;

     

    하지만 요즘은 무제한 요금제도 흔하고, OTT, SNS 그리고 흔한 거의 대부분의 앱들이 네트워크가 켜져있지 않으면 사용이 불가능한 경우가 많다.

     

    그렇기 때문에 네이티브 개발자는 네트워크 상태를 판단하고, 현재 앱에서 네트워크를 사용할 수 있는지 없는지를 판단하고,

    네트워크가 없을 경우 앱을 사용하지 못하게 할지 아니면 일정 부분만 사용을 못하게 할지 등 여러 가지 행동을 프로그래밍해놓을 수 있다.

     

    ConnectivityManager

     

    그렇다면 네트워크 상태를 어떻게 알 수 있을까?

     

    간단하다.

    우리 구글 형님들이 다해놓셨다...

    ConnectivityManager를 사용하면 간단하게 현재 네트워크에 연결이 되어있는지 혹은 연결이 됐는지 끊어졌는지, 단말기가 네트워크 통신을 할 수 있는 상태인지까지 알 수 있다.

    네트워크 정보도 얻어 올수 있다....

     

    네트워크 상태 바로 가져오기

     

    이 글에서 알아볼 것은 간단하게. 네트워크의 연결 상태만 알아보는 것만 정리해보려 한다.

    우선 바로 상태를 가져오는 코드를 알아보자

     

    val connectivityManager = getSystemService(ConnectivityManager::class.java)
    val currentNetwork = connectivityManager.activeNetwork

    getSystemservice를 통해서 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

Designed by Tistory.