Connectivity Manager

2023. 7. 28. 16:32개발/Android

Connectivity Manager란

  • Android 시스템 서비스
  • 네트워크 연결 상태에 대한 쿼리에 응답하는 클래스. 네트워크 연결이 변경되면 app에 알린다.

역할

  1. 네트워크 연결 모니터링(WIFI, GPRS, UMTS)
  1. 네트워크 연결 변경시 broadcast intent 전송
  1. 네트워크 연결 끊긴 경우 페일 오버 시도
  1. 앱이 사용 가능한 네트워크의 대략적 혹은 세분화된 상태를 쿼리하는 API제공
  1. App이 데이터 트래픽에 대한 네트워크를 요청하고 선택할 수 있도록 API 제공

클래스 얻기

val cm = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager

콜백

voidonAvailable(Network network) 프레임워크가 연결되고 사용할 준비가 된 새 네트워크를 선언했을 때 호출됩니다.
voidonCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) 요청에 해당하는 네트워크의 기능이 변경되었지만 요청된 기준을 만족할때
voidonLosing(Network network, int maxMsToLive) 남아있는 요청이 없어서 네트워크가 losing될 때
voidonLost(Network network) 네트워크 연결이 끊어졌을 때
voidonUnavailable() 지정된 시간 내에 네트워크를 찾을 수 없거나 요청된 네트워크 요청을 이행할 수 없는 경우

상수

StringACTION_CAPTIVE_PORTAL_SIGN_IN 장치가 인터넷 연결을 차단하는 캡티브 포털을 제공하는 네트워크에 연결되었습니다.
StringACTION_RESTRICT_BACKGROUND_CHANGED 백그라운드에서 측정되는 네트워크 활동 제한이 변경되었습니다.
StringEXTRA_CAPTIVE_PORTAL CaptivePortal인텐트 에 포함된 개체 의 조회 키입니다 ACTION_CAPTIVE_PORTAL_SIGN_IN.
StringEXTRA_CAPTIVE_PORTAL_URL 캡티브 포털 로그인 활동에 URL을 전달하기 위한 키입니다.
StringEXTRA_NETWORK Network애플리케이션 요청에 대한 네트워크를 성공적으로 찾은 후 인텐트에 포함된 개체 의 조회 키입니다 .
StringEXTRA_NETWORK_REQUEST NetworkRequest애플리케이션 요청에 대한 네트워크를 성공적으로 찾은 후 인텐트에 포함된 개체 의 조회 키입니다 .
StringEXTRA_NETWORK_TYPE 이 상수는 API 레벨 29에서 더 이상 사용되지 않습니다. 네트워크 유형은 최신 네트워크의 특성을 나타낼 만큼 풍부하지 않습니다. NetworkCapabilities특히 운송 수단을 대신 사용하십시오 .
StringEXTRA_NO_CONNECTIVITY 연결이 완전히 끊어졌는지, 즉 사용할 수 있는 네트워크가 없는지를 나타내는 부울에 대한 조회 키입니다.
StringEXTRA_REASON 네트워크 연결 시도가 실패한 이유를 나타내는 문자열에 대한 조회 키입니다.
intMULTIPATH_PREFERENCE_HANDOVER 시스템 기본 네트워크가 일시적으로 응답하지 않을 때 시간에 민감한 사용자 대면 작업을 위해 원활한 연결을 제공하기 위해 다중 경로 데이터를 잠시 사용할 수 있습니다.
intMULTIPATH_PREFERENCE_PERFORMANCE 측정된 데이터를 사용하여 네트워크 대기 시간 및 성능을 개선하는 것은 허용됩니다.
intMULTIPATH_PREFERENCE_RELIABILITY 주로 다른 네트워크를 통과하는 트래픽에 대한 백업 채널을 제공하기 위해 소량의 다중 경로 데이터를 지속적으로 사용하는 것은 허용됩니다.
intRESTRICT_BACKGROUND_STATUS_DISABLED 애플리케이션이 백그라운드에서 실행되는 동안 기기는 측정된 네트워크 활동을 제한하지 않습니다.
intRESTRICT_BACKGROUND_STATUS_ENABLED 애플리케이션이 백그라운드에서 실행되는 동안 장치가 측정된 네트워크 활동을 제한합니다.
intRESTRICT_BACKGROUND_STATUS_WHITELISTED 애플리케이션이 백그라운드에서 실행되는 동안 장치가 측정된 네트워크 활동을 제한하지만 애플리케이션이 이를 우회할 수 있습니다.

네트워크 요청 생성 (< API level 24)

val networkRequest = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .build()

Network Available Observe

class ConnectivityStateCollector(
  private val connectivityManager: ConnectivityManager,
  private val networkRequest: NetworkRequest
) {

  val connectivityFlow: Flow<Boolean> by lazy {
    callbackFlow { 
        object : ConnectivityManager.NetworkCallback() {
            override fun onAvailable(network: Network) {
                trySend(true)
            }
            override fun onLost(network: Network) {
                trySend(false)
            }
        }.let { callback ->
            connectivityManager.requestNetwork(networkRequest, callback)
            awaitClose { 
                connectivityManager.unregisterNetworkCallback(callback)
            }
        }
    }
  }
}

→24 이상은 이 문서를 참고하쇼

사용하기~

class MyViewModel(
  private val repository: Repository,
  private val connectivityState: ConnectivityStateCollector
) : ViewModel() {

  val uiState by lazy {
    connectivityState.connectivityFlow
      .flatMapLatest { isConnected ->
        if (isConnected) repository.fetchUiState()
        else flowOf(NetworkLostUiState)
      }
      .stateIn(viewModelScope, SharingStarted.Eagerly, null)
  }
}

네트워크 상태가 없을때 처리하는 방법

  • ui가 네트워크에 의존하는 경우, 초기 UI상태(안내문구 출력)등을 그릴 수 있는 NetworkLostUiState를 이용하기!
private fun isConnected(): Boolean = connectivityManager.activeNetwork?.run {
        connectivityManager.getNetworkCapabilities(this)?.let { networkCapabilities ->
            networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
                networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
        } ?: false
    } ?: false

Uploaded by N2T

'개발 > Android' 카테고리의 다른 글

Dialog With Navigation  (0) 2023.08.08
Recyclerview Payload  (0) 2023.07.28
AAC  (0) 2023.07.26
알아두면 좋은 Kotlin extension  (0) 2023.07.26
Android Macrobenchmark  (0) 2023.07.26