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

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);