lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

Monitoramento do nível de energia e do estado de carregamento

Quando a frequência das atualizações em segundo plano é alterada para reduzir o efeito dessas atualizações na vida útil da bateria, é recomendável verificar o nível atual da bateria e o estado de carregamento .

O impacto na vida útil da bateria devido à execução de atualizações de aplicativos depende do nível da bateria e do estado de carregamento do dispositivo. O impacto da execução de atualizações enquanto o dispositivo está carregando via CA é insignificante e, na maioria dos casos, você pode maximizar a taxa de atualização sempre que o dispositivo está conectado a um carregador de parede. Por outro lado, se o dispositivo estiver descarregando, a redução da taxa de atualização ajudará a prolongar a vida útil da bateria.

Da mesma forma, será possível conferir o nível de carregamento da bateria reduzindo potencialmente a frequência de — ou até mesmo interrompendo — as atualizações quando a carga da bateria estiver quase acabando.

Determinar o estado de carregamento atual

Comece determinando o estado do carregamento atual. O BatteryManager transmite todos os detalhes da bateria e do carregamento em uma Intent fixa que inclui o estado de carregamento.

Por ser um intent fixa, não é preciso registrar um BroadcastReceiver—simplesmente chamando registerReceiver passando null como receptor, como mostrado no próximo snippet, o intent de estado atual da bateria é retornada. Você pode passar um objeto BroadcastReceiver real aqui, mas não é necessário, pois abordaremos as atualizações em uma seção posterior.

IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);

Você poderá extrair o estado de carregamento atual e, se o dispositivo estiver sendo carregado, saber se isso está sendo feito via USB ou do carregador de CA:

// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                     status == BatteryManager.BATTERY_STATUS_FULL;

// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;

Normalmente, você deve maximizar a taxa de atualizações em segundo plano no caso em que o dispositivo está conectado a um carregador de AC, reduzir a taxa se for via USB e diminuir ainda mais se a bateria estiver descarregando.

Monitorar alterações no estado de carregamento

O estado de carregamento pode mudar tão facilmente quanto a conexão de um dispositivo, por isso, é importante monitorar as mudanças no estado de carregamento e alterar adequadamente a taxa de atualização.

O BatteryManager transmite uma ação sempre que o dispositivo está conectado ou desconectado da energia. É importante receber esses eventos mesmo que o aplicativo não esteja em execução — especialmente porque esses eventos afetam a frequência de inicialização do aplicativo para iniciar uma atualização em segundo plano —, portanto deve-se registrar um BroadcastReceiver no manifesto, definindo ACTION_POWER_CONNECTED e ACTION_POWER_DISCONNECTED dentro de um filtro de intent.

<receiver android:name=".PowerConnectionReceiver">
  <intent-filter>
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
  </intent-filter>
</receiver>

Dentro da implementação de BroadcastReceiver, é possível extrair o estado de carregamento atual e o método, como descrito na etapa anterior.

public class PowerConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                            status == BatteryManager.BATTERY_STATUS_FULL;

        int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
        boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
    }
}

Determinar o nível atual da bateria

Em alguns casos, é útil também determinar o nível atual da bateria. Você poderá optar pela redução da taxa das atualizações em segundo plano se a carga da bateria estiver abaixo de um determinado nível.

A carga atual da bateria pode ser encontrada extraindo o nível e a escala atual da bateria do intent de estado da bateria, como mostrado aqui:

int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

float batteryPct = level / (float)scale;

Monitorar alterações significativas no nível da bateria

Não é fácil monitorar continuamente o estado da bateria, mas não é preciso fazer isso.

Em termos gerais, o impacto do monitoramento constante do nível da bateria é maior na bateria do que no comportamento normal do aplicativo. Uma prática recomendada é monitorar somente alterações significativas no nível da bateria — especialmente quando o dispositivo entra ou sai de um estado de bateria baixa.

O snippet do manifesto abaixo é extraído do elemento do filtro de intent dentro de um receptor de transmissão. O receptor é acionado sempre que a bateria de um dispositivo fica baixa ou sai dessa condição ao ouvir ACTION_BATTERY_LOW e ACTION_BATTERY_OKAY.

<receiver android:name=".BatteryLevelReceiver">
<intent-filter>
  <action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
  <action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
  </intent-filter>
</receiver>

Em geral, recomenda-se desativar todas as atualizações em segundo plano quando a bateria está criticamente baixa. Não importa se os seus dados estão atualizados se o telefone desligar antes que seja possível usá-lo.

Em muitos casos, o ato de carregar um dispositivo coincide com colocá-lo em uma base. A lição a seguir mostra como determinar o estado de ancoragem atual e monitorar alterações na ancoragem do dispositivo.