Connectivity Manager란
- Android 시스템 서비스
- 네트워크 연결 상태에 대한 쿼리에 응답하는 클래스. 네트워크 연결이 변경되면 app에 알린다.
역할
- 네트워크 연결 모니터링(WIFI, GPRS, UMTS)
- 네트워크 연결 변경시 broadcast intent 전송
- 네트워크 연결 끊긴 경우 페일 오버 시도
- 앱이 사용 가능한 네트워크의 대략적 혹은 세분화된 상태를 쿼리하는 API제공
- App이 데이터 트래픽에 대한 네트워크를 요청하고 선택할 수 있도록 API 제공
클래스 얻기
val cm = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
콜백
void | onAvailable(Network network) 프레임워크가 연결되고 사용할 준비가 된 새 네트워크를 선언했을 때 호출됩니다. |
void | onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) 요청에 해당하는 네트워크의 기능이 변경되었지만 요청된 기준을 만족할때 |
void | onLosing(Network network, int maxMsToLive) 남아있는 요청이 없어서 네트워크가 losing될 때 |
void | onLost(Network network) 네트워크 연결이 끊어졌을 때 |
void | onUnavailable() 지정된 시간 내에 네트워크를 찾을 수 없거나 요청된 네트워크 요청을 이행할 수 없는 경우 |
상수
String | ACTION_ CAPTIVE_ PORTAL_ SIGN_ IN
장치가 인터넷 연결을 차단하는 캡티브 포털을 제공하는 네트워크에 연결되었습니다. |
String | ACTION_ RESTRICT_ BACKGROUND_ CHANGED
백그라운드에서 측정되는 네트워크 활동 제한이 변경되었습니다. |
String | EXTRA_ CAPTIVE_ PORTAL
CaptivePortal 인텐트 에 포함된 개체 의 조회 키입니다 ACTION_CAPTIVE_PORTAL_SIGN_IN . |
String | EXTRA_ CAPTIVE_ PORTAL_ URL
캡티브 포털 로그인 활동에 URL을 전달하기 위한 키입니다. |
String | EXTRA_ NETWORK
Network 애플리케이션 요청에 대한 네트워크를 성공적으로 찾은 후 인텐트에 포함된 개체 의 조회 키입니다 . |
String | EXTRA_ NETWORK_ REQUEST
NetworkRequest 애플리케이션 요청에 대한 네트워크를 성공적으로 찾은 후 인텐트에 포함된 개체 의 조회 키입니다 . |
String | EXTRA_ NETWORK_ TYPE
이 상수는 API 레벨 29에서 더 이상 사용되지 않습니다. 네트워크 유형은 최신 네트워크의 특성을 나타낼 만큼 풍부하지 않습니다. NetworkCapabilities 특히 운송 수단을 대신 사용하십시오 . |
String | EXTRA_ NO_ CONNECTIVITY
연결이 완전히 끊어졌는지, 즉 사용할 수 있는 네트워크가 없는지를 나타내는 부울에 대한 조회 키입니다. |
String | EXTRA_ REASON
네트워크 연결 시도가 실패한 이유를 나타내는 문자열에 대한 조회 키입니다. |
int | MULTIPATH_ PREFERENCE_ HANDOVER
시스템 기본 네트워크가 일시적으로 응답하지 않을 때 시간에 민감한 사용자 대면 작업을 위해 원활한 연결을 제공하기 위해 다중 경로 데이터를 잠시 사용할 수 있습니다. |
int | MULTIPATH_ PREFERENCE_ PERFORMANCE
측정된 데이터를 사용하여 네트워크 대기 시간 및 성능을 개선하는 것은 허용됩니다. |
int | MULTIPATH_ PREFERENCE_ RELIABILITY
주로 다른 네트워크를 통과하는 트래픽에 대한 백업 채널을 제공하기 위해 소량의 다중 경로 데이터를 지속적으로 사용하는 것은 허용됩니다. |
int | RESTRICT_ BACKGROUND_ STATUS_ DISABLED
애플리케이션이 백그라운드에서 실행되는 동안 기기는 측정된 네트워크 활동을 제한하지 않습니다. |
int | RESTRICT_ BACKGROUND_ STATUS_ ENABLED
애플리케이션이 백그라운드에서 실행되는 동안 장치가 측정된 네트워크 활동을 제한합니다. |
int | RESTRICT_ 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