Register now for Android Dev Summit 2019!

Determinar e monitorar o status da conectividade

Alguns dos usos mais comuns para alarmes com repetição e serviços em segundo plano é agendar atualizações regulares dos dados de aplicativo utilizando recursos da Internet, dados de cache ou a execução de downloads longos. Mas, se você não estiver conectado à Internet ou se a conexão for lenta demais para concluir o download, por que acordar o dispositivo para agendar a atualização?

Use o ConnectivityManager para verificar se há realmente uma conexão à Internet e, se houver, qual é o tipo de conexão existente.

Determinar se há uma conexão à Internet

Não é necessário agendar uma atualização com base em um recurso da Internet se não houver uma conexão à Internet. O snippet a seguir mostra como usar o ConnectivityManager para consultar a rede ativa e determinar se ela tem conectividade com a Internet.

Kotlin

    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
    val isConnected: Boolean = activeNetwork?.isConnectedOrConnecting == true
    

Java

    ConnectivityManager cm =
            (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    boolean isConnected = activeNetwork != null &&
                          activeNetwork.isConnectedOrConnecting();
    

Determinar o tipo de conexão à Internet

Também é possível determinar o tipo de conexão à Internet disponível no momento.

A conectividade do dispositivo pode ser oferecida por dados móveis, WiMAX, Wi-Fi e conexões Ethernet. Ao consultar o tipo de rede ativa, como mostrado abaixo, é possível alterar a taxa de atualização com base na largura de banda disponível.

Kotlin

    val isWiFi: Boolean = activeNetwork?.type == ConnectivityManager.TYPE_WIFI
    

Java

    boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
    

Custos de dados móveis tendem a ser significativamente mais altos do que Wi-Fi. Assim, na maioria dos casos, a taxa de atualização do app precisa ser menor durante conexões móveis. Da mesma forma, downloads de tamanho significativo precisam ser suspensos até que haja uma conexão Wi-Fi.

Após desativar as atualizações, é importante ouvir as mudanças na conectividade para continuar após uma conexão à Internet ser estabelecida.

Monitorar alterações na conectividade

Apps para Android 7.0 (nível de API 24) e posteriores não recebem transmissões CONNECTIVITY_ACTION quando declaram o broadcast receiver no manifesto. Os apps ainda poderão receber transmissões CONNECTIVITY_ACTION se registrarem o BroadcastReceiver com Context.registerReceiver() e se esse contexto ainda for válido.