안드로이드/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이면 네트워크 연결이 안 된 상태입니다.