Quando você altera a frequência das atualizações em segundo plano para reduzir o efeito dessas atualizações sobre a duração da bateria, verificar o nível atual da bateria e o estado de carregamento é um bom lugar para começar.
O impacto na duração da bateria devido à execução de atualizações de aplicativos depende do nível da bateria e estado de carregamento do dispositivo. O impacto da execução de atualizações enquanto o dispositivo está carregando em CA é insignificante. Portanto, na maioria dos casos, é possível maximizar a taxa de atualização sempre que o dispositivo estiver conectado a um carregador de parede. Por outro lado, se o dispositivo estiver descarregando, reduzir a taxa de atualização ajudará prolongar a duração da bateria.
Da mesma forma, você pode verificar o nível de carga da bateria, potencialmente reduzindo a frequência ou até mesmo interrompendo: suas atualizações quando a carga da bateria estiver quase acabando.
Determinar o estado de carregamento atual
Comece determinando o status de carregamento atual. O BatteryManager
transmite todos os detalhes da bateria e do carregamento em uma Intent
fixa que inclui
o status de carregamento.
Como essa é uma intent fixa, você não precisa registrar um BroadcastReceiver
. Basta chamar registerReceiver
transmitindo
null
como receptor, conforme mostrado no próximo snippet, a intent de status atual da bateria é
retornados. É possível transmitir um objeto BroadcastReceiver
real aqui, mas
vamos lidar com as atualizações em uma seção posterior. Portanto, isso não é necessário.
Kotlin
val batteryStatus: Intent? = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { ifilter -> context.registerReceiver(null, ifilter) }
Java
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter);
Você pode extrair o status de carregamento atual e, se o dispositivo estiver sendo carregado, se se está carregando via USB ou carregador CA:
Kotlin
val status: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1 val isCharging: Boolean = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL // How are we charging? val chargePlug: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) ?: -1 val usbCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_USB val acCharge: Boolean = chargePlug == BatteryManager.BATTERY_PLUGGED_AC
Java
// 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, é preciso maximizar a taxa de atualizações em segundo plano caso o dispositivo esteja conectado a um carregador de parede, reduz a taxa se a carga for via USB e diminua-a se a bateria estiver descarregando.
Monitorar mudanças no estado de carregamento
O status de carregamento pode mudar tão facilmente quanto a conexão de um dispositivo, por isso é importante monitorar o estado de carregamento em busca de alterações e alterar a taxa de atualização de acordo.
O BatteryManager
transmite uma ação sempre que o dispositivo está conectado ou
sem energia. É importante receber esses eventos mesmo que o app não esteja
em execução, especialmente porque esses eventos devem afetar a frequência com que você inicia o aplicativo para
iniciar uma atualização em segundo plano. Portanto, registre um BroadcastReceiver
no manifesto para detectar os dois eventos, definindo o
ACTION_POWER_CONNECTED
e ACTION_POWER_DISCONNECTED
em 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>
Determinar o nível atual da bateria
Em alguns casos, também é útil determinar o nível atual da bateria. Você pode optar por reduzir a taxa das atualizações em segundo plano se a carga da bateria estiver abaixo de um determinado nível.
Você pode encontrar a carga atual da bateria extraindo o nível e a escala atual da bateria intent de status da bateria, como mostrado aqui:
Kotlin
val batteryPct: Float? = batteryStatus?.let { intent -> val level: Int = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) val scale: Int = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1) level * 100 / scale.toFloat() }
Java
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level * 100 / (float)scale;
Reagir a mudanças significativas no nível da bateria
Não é fácil monitorar continuamente o estado da bateria, mas não é preciso fazer isso.
De modo geral, o impacto do monitoramento do nível de bateria é maior
na bateria do que o comportamento normal do aplicativo. Por exemplo, registrar um
BroadcastReceiver
no manifesto para cancelar o trabalho pendente quando a bateria estiver fraca vai
servem principalmente para descarregar ainda mais a bateria (e, portanto,
impossível, pois
Android 8.0). Em vez disso, você pode fornecer restrições ao trabalho que descrevem quando ele deve ser executado,
permitindo que o sistema tome a decisão sem gastar energia para inicializar o app.
Em geral, é recomendável não executar as atualizações em segundo plano quando a bateria
criticamente baixa. Não importa se seus dados estão atualizados se o smartphone desligar antes que você
em que podemos usá-lo. Para isso,
usar a biblioteca WorkManager
com um
Restrição BatteryNotLow
para especificar que o trabalho não deve ser executado se a bateria estiver fraca (além de quaisquer
NetworkType
).
Em muitos casos, o ato de carregar um dispositivo coincide com colocá-lo em uma base. O próximo mostra como determinar o estado atual da base e monitorar alterações no dispositivo base.