안드로이드앱이 네트워크상태를 체크하고, 적절한 대응 및 유저노티를 처리 해주는 로직은 많이 구현하고 있을 것이다. 이전 NetworkInfo API가 Deprecated되어서 새로운 방식으로 네트워크 상태 체크를 진행해는것을 찾게 되었고, 이에 대해 정리한다.
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
val isConnected: Boolean = activeNetwork?.isConnectedOrConnecting == true
private val networkCallBack = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
// 네트워크 연결시 콜백
}
override fun onLost(network: Network) {
// 네트워크 연결이 끊기는 경우 콜백
}
}
val connectivityManager = getSystemService(ConnectivityManager::class.java)
val networkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build()
connectivityManager.registerNetworkCallback(networkRequest, networkCallBack)
val connectivityManager = getSystemService(ConnectivityManager::class.java)
val currentNetwork = connectivityManager.getActiveNetwork()
val caps = connectivityManager.getNetworkCapabilities(currentNetwork)
val linkProperties = connectivityManager.getLinkProperties(currentNetwork)
// 네트워크 연결정보 획득 -> (네트워크 연결 상태)
// or null 반환시 -> (네트워크 미연결 상태)
API 테스트결과 NetworkRequest 에 TransportType으로 등록한 네트워크타입의 콜백이 각각 별도로 동시다발적으로 발생되어진다. 세부적인 네트워크 상태 콜백이긴하나 현재 앱 사용중 단말의 네트워크에 연결 상태를 파악하기 위한 목적으로 사용하기에는 부적절한것 같다.
이러한 목적에 적합한 API가 맞을지 좀 더 리서칭이 필요할것 같으나, 현재로선 즉시 네트워크상태를 가져오는 메소드로 활용하는것이 나을듯하다. 이번에 신규 프로젝트 진행하면서 다시 한번 체크해봐야겠다~