Manipulação de receptores de transmissão sob demanda

A maneira mais simples de monitorar mudanças de estado do dispositivo é criar um BroadcastReceiver para cada estado que você está monitorando e registrar cada um deles no manifesto do aplicativo. Em seguida, dentro de cada um desses receptores, basta agendar novamente os alarmes com base no estado atual do dispositivo.

Um efeito colateral dessa abordagem é que o aplicativo acordará o dispositivo a cada vez que um desses receptores for acionado — potencialmente com muito mais frequência do que necessário.

Uma abordagem melhor é desativar ou ativar os receptores de transmissão no tempo de execução. Dessa forma, você pode usar os receptores declarados no manifesto como alarmes passivos, acionados por eventos do sistema somente quando necessário.

Alternar e replicar receptores de mudança de estado para melhorar a eficiência

Você pode usar PackageManager para alternar o estado ativado de qualquer componente definido no manifesto, incluindo qualquer receptor de transmissão que quiser ativar ou desativar, como mostrado no snippet abaixo:

ComponentName receiver = new ComponentName(context, myReceiver.class);

PackageManager pm = context.getPackageManager();

pm.setComponentEnabledSetting(receiver,
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
        PackageManager.DONT_KILL_APP)

Usando essa técnica, se determinar que a conectividade foi perdida, você poderá desativar todos os receptores, exceto o receptor de mudança de conectividade. Por outro lado, após estar conectado, poderá parar de ouvir as mudanças de conectividade e simplesmente conferir se está on-line imediatamente antes de fazer uma atualização e agendar novamente um alarme de atualização recorrente.

Você pode usar a mesma técnica para retardar um download que requer maior largura de banda para ser concluído. Basta ativar um receptor de transmissão que ouça as mudanças de conectividade e iniciar o download somente após a conexão com a rede Wi-Fi.