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.