Monitorowanie poziomu baterii i stanu ładowania

Kiedy zmieniasz częstotliwość aktualizacji w tle, aby ograniczyć ich wpływ aktualizacje dotyczące żywotności baterii, sprawdzanie aktualnego poziomu baterii i stanu ładowania to dobre miejsce, i rozpoczęcia odtwarzania.

Wpływ aktualizacji na żywotność baterii zależy od poziomu baterii stan ładowania urządzenia. Wpływ wykonywania aktualizacji podczas ładowania urządzenia przez gniazdo ścienne jest znikomy, więc w większości przypadków możesz zmaksymalizować częstotliwość odświeżania, gdy urządzenie jest podłączone do ładowarki ściennej. Jeśli natomiast urządzenie się rozładowuje, zmniejszenie częstotliwości aktualizacji pomaga wydłuży to czas pracy na baterii.

W podobny sposób możesz sprawdzić poziom naładowania baterii, co może zmniejszyć częstotliwość – lub nawet gdy bateria się wyczerpuje.

Określanie bieżącego stanu ładowania

Najpierw określ bieżący stan ładowania. BatteryManager przesyła wszystkie dane dotyczące baterii i ładowania w przyklejonym Intent, który zawiera: stan ładowania.

Ponieważ jest to intencja trwała, nie musisz rejestrować BroadcastReceiver – wystarczy wywołać funkcję registerReceiver z przekazywaniem null jako odbiornik, jak pokazano w następnym fragmencie, bieżący stan baterii to . Możesz tu przekazać rzeczywisty obiekt BroadcastReceiver, ale będziemy obsługiwać aktualizacje w późniejszej sekcji, więc nie jest to konieczne.

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);

Możesz wyodrębnić zarówno bieżący stan ładowania, jak i to, czy urządzenie jest ładowane przez USB czy przez ładowarkę sieciową:

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;

Zazwyczaj należy zmaksymalizować częstotliwość aktualizacji w tle, gdy urządzenie jest podłączone do ładowarki sieciowej, zmniejszyć częstotliwość, jeśli ładowanie odbywa się przez USB, i jeszcze bardziej obniżyć częstotliwość, gdy bateria się rozładowuje.

Monitorowanie zmian stanu ładowania

Stan ładowania może się zmieniać tak samo łatwo, jak można podłączyć urządzenie, dlatego ważne jest monitorowanie stanu ładowania pod kątem zmian i odpowiednie dostosowywanie częstotliwości odświeżania.

Urządzenie BatteryManager przesyła komunikat o działaniu za każdym razem, gdy jest podłączone lub odłączony od zasilania. Ważne jest, aby te zdarzenia były odbierane nawet wtedy, gdy aplikacja nie jest uruchomiona. Zwłaszcza, że powinny one wpływać na częstotliwość uruchamiania aplikacji w celu zainicjowania aktualizacji w tle. Aby rejestrować oba zdarzenia, w pliku manifestu zarejestruj BroadcastReceiver, definiując ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED w filtrze intencji.

<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>

Określanie bieżącego poziomu baterii

W niektórych przypadkach przydatne może być też określenie bieżącego poziomu naładowania baterii. Jeśli poziom naładowania baterii jest niski, możesz zmniejszyć częstotliwość aktualizacji w tle.

Aby poznać aktualny poziom naładowania baterii, pobierz bieżący poziom baterii i przeskaluj z jak widać tutaj intencję dotyczącą stanu baterii:

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;

reagować na znaczne zmiany poziomu baterii,

Nie da się w dowolny sposób stale monitorować stanu baterii, ale nie jest to konieczne.

Monitorowanie poziomu naładowania baterii ma zazwyczaj wpływa na baterię niż na normalne działanie aplikacji. Na przykład rejestrowanie w pliku manifestu elementu BroadcastReceiver, aby anulować oczekujące zadania, gdy poziom naładowania baterii jest niski, spowoduje głównie dalsze rozładowywanie baterii (i dlatego jest niemożliwe od Androida 8.0). Zamiast tego możesz określać ograniczenia dotyczące pracy, które opisują, kiedy należy ją uruchomić, umożliwiając systemowi podjęcie decyzji bez zużywania energii po uruchomieniu aplikacji.

Zaleca się nie uruchamiać aktualizacji w tle, gdy bateria jest rozładowana. krytycznie niski. Nie ma znaczenia, jak świeże są dane, jeśli telefon wyłączy się, zanim uda Ci się z nich skorzystać. Aby to zrobić: korzystaj z biblioteki WorkManager z Ograniczenie: BatteryNotLow aby zaznaczyć, że praca nie powinna być wykonywana, gdy bateria jest słaba (oprócz wszystkich NetworkType ograniczeń).

W wielu przypadkach ładowanie urządzenia jest równoznaczne z umieszczeniem go na ładowarce. Więcej informacji: Określ i do monitorowania stanu i typu dokowania.