Como procurar uma rede Wi-Fi preferencial de descarga

As buscas por redes preferenciais de descarga (PNO, na sigla em inglês) de Wi-Fi são buscas de Wi-Fi de baixa potência que ocorrem em intervalos regulares quando um dispositivo está desconectado do Wi-Fi e a tela está desligada. As buscas por PNO são usadas para encontrar e se conectar a redes salvas. Essas buscas são programadas pelo framework usando o comando NL80211_CMD_START_SCHED_SCAN. Para mais informações, consulte nl80211.h.

Otimizar o uso de energia com informações de mobilidade do dispositivo

Em dispositivos com o Android 9 ou versões anteriores, quando o dispositivo está desconectado do Wi-Fi e a tela está desligada, as buscas por PNO ocorrem em intervalos de 20 segundos nas três primeiras buscas e, em seguida, diminuem para uma busca a cada 60 segundos para todas as buscas subsequentes. A busca por PNO é interrompida quando uma rede salva é encontrada ou a tela é ativada.

O Android 10 introduz um método de API opcional chamado setDeviceMobilityState() em WifiManager que aumenta o intervalo entre as buscas por PNO com base no estado de mobilidade do dispositivo para reduzir o consumo de energia.

Os estados de mobilidade possíveis são:

  • DEVICE_MOBILITY_STATE_UNKNOWN: mobilidade desconhecida
  • DEVICE_MOBILITY_STATE_HIGH_MVMT: em uma bicicleta ou em um veículo motorizado
  • DEVICE_MOBILITY_STATE_LOW_MVMT: caminhando ou correndo
  • DEVICE_MOBILITY_STATE_STATIONARY: sem movimento

Se o dispositivo estiver parado, o framework do Android aumentará o intervalo entre as buscas por PNO de 60 segundos para 180 segundos para reduzir o consumo de energia. Essa otimização é feita com a suposição de que o dispositivo provavelmente não encontrará novas redes em buscas por PNO quando não estiver em movimento.

Se o dispositivo estiver em qualquer outro estado de mobilidade ou se o método não for chamado, ele usará o comportamento de busca por PNO padrão.

Implementação

Para implementar esse recurso de otimização de energia em um dispositivo com o Android 10 ou versões mais recentes, derive as informações de mobilidade do dispositivo e chame o método setDeviceMobilityState() de um app do sistema personalizado.