Debbi Story

[Android] 네트워크 연결 감지하기! 본문

안드로이드/Tip

[Android] 네트워크 연결 감지하기!

Debbi 2021. 11. 14. 23:27
728x90

 

 

https://developer.android.com/training/basics/network-ops/reading-network-state?hl=ko 

 

네트워크 상태 읽기  |  Android 개발자  |  Android Developers

네트워크 상태 읽기 Android에서는 앱이 연결의 동적 변경사항을 학습할 수 있습니다. 다음 클래스를 사용하여 연결 변경사항을 추적하고 적절히 대응하세요. ConnectivityManager는 앱에 시스템의 연

developer.android.com

 

LiveData와 ConnectivityManager를 사용해 네트워크 변경을 리스너처럼 감지하는 방법입니다.

class NetworkConnection(
	private val context: Context
): LiveData<Boolean>() {

    private var connectivityManager: ConnectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    private lateinit var networkCallback: ConnectivityManager.NetworkCallback

    override fun onActive() {
        super.onActive()
        updateConnection()

        when {
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> {
                connectivityManager.registerDefaultNetworkCallback(connectivityManagerCallback())
            }
            else -> {
                val request = NetworkRequest.Builder().build()
                connectivityManager.registerNetworkCallback(request, connectivityManagerCallback())
            }
        }
    }

    override fun onInactive() {
        super.onInactive()
        connectivityManager.unregisterNetworkCallback(networkCallback)
    }

    private fun connectivityManagerCallback(): ConnectivityManager.NetworkCallback {
        networkCallback = object : ConnectivityManager.NetworkCallback() {
            override fun onLost(network: Network) {
                super.onLost(network)
                postValue(false)
            }

            override fun onUnavailable() {
                super.onUnavailable()
                postValue(false)
            }
            override fun onAvailable(network: Network) {
                super.onAvailable(network)
                postValue(true)
            }

        }
        return networkCallback
    }


    private fun updateConnection() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            postValue(connectivityManager.isDefaultNetworkActive)
        }else {
            val activeNetwork: NetworkInfo? = connectivityManager.activeNetworkInfo
            postValue(activeNetwork?.isConnected)
        }
    }

}

 

안드로이드 10버전 부터 NetworkInfo가 deprecated되어 분기 처리를 해주었습니다.

 

사용방법은 Activity에서 아래처럼 observe하면 끝입니다!

val networkConnect = NetworkConnection(context)
networkConnect.observe(this) { isConnected ->

}

 

 

 

또 한가지 순간적인 네트워크 상태를 가져오는 방법입니다.

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

 

currentNetwork 값이 null이면 네트워크 연결이 안 된 상태입니다.