Skip to content

Most visited

Recently visited

navigation

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.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Siga o Google Developers no WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)