Monitorar o status da conectividade e a limitação de conexão

O ConnectivityManager fornece uma API que permite solicitar que o dispositivo se conecte a uma rede com base em várias condições, incluindo recursos do dispositivo e opções de transporte de dados.

A implementação do callback fornece informações ao app sobre o status de conexão do dispositivo, bem como os recursos da rede conectada no momento. A API permite determinar se o dispositivo está conectado a uma rede que atende aos requisitos do app.

Configurar uma solicitação de rede

Para especificar o tipo de transporte da rede, como Wi-Fi ou conexão celular, e os recursos da rede conectada no momento, como conexão de Internet, é necessário configurar uma solicitação de rede.

Declare um NetworkRequest que descreva as necessidades de conexão de rede do app. O código a seguir cria uma solicitação para uma rede conectada à Internet e usa uma conexão Wi-Fi, Ethernet ou celular para o tipo de transporte.

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

Algumas conexões podem ser significativamente mais caras do que outras (por exemplo, uma conexão móvel costuma ser cara). Use NetworkCapabilities#NET_CAPABILITY_NOT_METERED para determinar se a conexão é cara. Em uma conexão limitada, tente reduzir o consumo de dados do app ou adie o consumo até que o dispositivo tenha uma conexão ilimitada.

Configurar um callback de rede

Ao registrar o NetworkRequest com o ConnectivityManager, é necessário implementar um NetworkCallback para receber notificações sobre mudanças no status da conexão e nos recursos de rede.

As funções mais implementadas no NetworkCallback incluem:

  • onAvailable() indica que o dispositivo está conectado a uma nova rede que atende aos requisitos de recursos e tipo de transporte especificados no NetworkRequest.
  • onLost() indica que o dispositivo perdeu a conexão com a rede.
  • onCapabilitiesChanged() indica que os recursos da rede mudaram. O objeto NetworkCapabilities fornece informações sobre os recursos atuais da rede.

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

    // Network capabilities have changed for the network.
    override fun onCapabilitiesChanged(
        network: Network,
        networkCapabilities: NetworkCapabilities
    ) {
        val unmetered =
            networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
        if (!unmetered) {
            // Reduce data usage, or delay it until the network is unmetered.
        }
    }

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

Registrar atualizações de rede

Depois de declarar NetworkRequest e NetworkCallback, use as funções requestNetwork() ou registerNetworkCallback() para pesquisar uma rede para se conectar do dispositivo que satisfaça o NetworkRequest. O status é informado ao NetworkCallback.

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