연결 상태 및 연결 측정 모니터링

ConnectivityManager는 기기 기능 및 데이터 전송 옵션을 비롯한 다양한 조건에 따라 기기가 네트워크에 연결되도록 요청할 수 있는 API를 제공합니다.

콜백 구현은 기기의 연결 상태와 현재 연결된 네트워크의 기능에 관한 정보를 앱에 제공합니다. 이 API를 사용하면 기기가 현재 앱의 요구사항을 충족하는 네트워크에 연결되어 있는지 확인할 수 있습니다.

네트워크 요청 구성

Wi-Fi 또는 모바일 데이터 연결과 같은 네트워크의 전송 유형과 현재 연결된 네트워크의 기능(예: 인터넷 연결)을 지정하려면 네트워크 요청을 구성해야 합니다.

앱의 네트워크 연결 요구사항을 설명하는 NetworkRequest를 선언합니다. 다음 코드는 인터넷에 연결되어 있고 전송 유형에 Wi-Fi 또는 모바일 네트워크 연결을 사용하는 네트워크에 대한 요청을 만듭니다.

Kotlin

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

자바

NetworkRequest networkRequest = new NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .build();

일부 연결은 다른 연결보다 훨씬 비쌀 수 있습니다 (예: 모바일 연결은 일반적으로 비쌈). NetworkCapabilities#NET_CAPABILITY_NOT_METERED를 사용하여 연결 비용이 많이 드는지 확인합니다. 데이터 종량제 연결 사용 시에는 앱의 데이터 사용량을 줄이거나 기기에 데이터 전송량 제한이 없는 연결을 설정할 때까지 데이터 사용을 지연시킵니다.

네트워크 콜백 구성

NetworkRequestConnectivityManager에 등록할 때는 연결 상태 및 네트워크 기능 변경에 관한 알림을 수신하기 위해 NetworkCallback를 구현해야 합니다.

NetworkCallback에서 가장 일반적으로 구현되는 함수에는 다음이 포함됩니다.

  • onAvailable()는 기기가 NetworkRequest에 지정된 기능 및 전송 유형 요구사항을 충족하는 새 네트워크에 연결되었음을 나타냅니다.
  • onLost()는 기기의 네트워크 연결이 끊겼음을 나타냅니다.
  • onCapabilitiesChanged()는 네트워크 기능이 변경되었음을 나타냅니다. NetworkCapabilities 객체는 네트워크의 현재 기능에 관한 정보를 제공합니다.

Kotlin

private val networkCallback = object : ConnectivityManager.NetworkCallback() {
    // network is available for use
    override fun onAvailable(network: Network) {
        super.onAvailable(network)
    }

    // Network capabilities have changed for the network
    override fun onCapabilitiesChanged(
            network: Network,
            networkCapabilities: NetworkCapabilities
    ) {
        super.onCapabilitiesChanged(network, networkCapabilities)
        val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
    }

    // lost network connection
    override fun onLost(network: Network) {
        super.onLost(network)
    }
}

자바

private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(@NonNull Network network) {
        super.onAvailable(network);
    }

    @Override
    public void onLost(@NonNull Network network) {
        super.onLost(network);
    }

    @Override
    public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
        super.onCapabilitiesChanged(network, networkCapabilities);
        final boolean unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
    }
};

네트워크 업데이트 등록

NetworkRequestNetworkCallback를 선언한 후 requestNetwork() 또는 registerNetworkCallback() 함수를 사용하여 NetworkRequest를 충족하는 기기에서 연결할 네트워크를 검색합니다. 그러면 상태가 NetworkCallback에 보고됩니다.

Kotlin

val connectivityManager = getSystemService(ConnectivityManager::class.java) as ConnectivityManager
connectivityManager.requestNetwork(networkRequest, networkCallback)

Java

ConnectivityManager connectivityManager =
        (ConnectivityManager) getSystemService(ConnectivityManager.class);
connectivityManager.requestNetwork(networkRequest, networkCallback);