Monitorowanie poziomu baterii i stanu ładowania

Gdy 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 aplikacji na czas pracy na baterii zależy od poziomu naładowania baterii i stanu ł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.

Podobnie możesz sprawdzić poziom naładowania baterii, aby zmniejszyć częstotliwość aktualizacji lub nawet je zatrzymać, gdy bateria jest prawie rozładowana.

Określanie bieżącego stanu ładowania

Zacznij od określenia bieżącego stanu naładowania. BatteryManagerwyświetla wszystkie informacje o baterii i ładowaniu w przyklejonym Intent, który zawiera stan ładowania.

Ponieważ jest to trwały zamiar, nie musisz rejestrować BroadcastReceiver. Wystarczy wywołać registerReceiver, przekazując null jako odbiornik, jak pokazano w następnym fragmencie kodu. W zwrotnej informacji zostanie zwrócony bieżący stan baterii. Możesz przekazać tutaj rzeczywisty obiekt BroadcastReceiver, ale Aktualizacjami zajmiemy się w kolejnej 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 sprawdzić bieżący stan ładowania oraz, jeśli urządzenie jest ładowane, Ładuje się przez ładowarkę USB lub AC:

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ć równie łatwo, jak podłączenie urządzenia, dlatego ważne jest, monitorować stan ładowania pod kątem zmian i odpowiednio zmienić częstotliwość odświeżania.

BatteryManager przekazuje działanie, gdy urządzenie jest podłączone lub odłączone od zasilania. Ważne jest, aby te zdarzenia były odbierane nawet wtedy, gdy aplikacja nie jest uruchomiona. Wpływają one na częstotliwość uruchamiania aplikacji w celu zainicjowania aktualizacji w tle. Aby rejestrować oba zdarzenia, w pliku manifestu zdefiniuj BroadcastReceiver, określając wartości 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. Możesz zmniejszyć częstotliwość aktualizacji w tle, jeśli poziom naładowania baterii spadnie poniżej określonego poziomu.

Aktualny stan naładowania baterii możesz sprawdzić, wyodrębniając bieżący poziom naładowania i skalę z intencji dotyczącej stanu baterii w ten sposób:

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.

Ogólnie rzecz biorąc, monitorowanie poziomu naładowania baterii ma większy wpływ na baterię niż normalne działanie aplikacji. Na przykład zarejestrowanie BroadcastReceiver w pliku manifestu do anulowania oczekujących zadań przy niskim poziomie baterii spowoduje służą głównie do dalszego zużywania baterii (i dlatego niemożliwe od Android 8.0). Zamiast tego możesz określić ograniczenia dotyczące pracy, które opisują, kiedy powinna być wykonywana, pozwalając systemowi podejmować decyzje bez marnowania mocy na uruchamianie 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 innych NetworkType ograniczeń).

W wielu przypadkach ładowanie urządzenia jest równoznaczne z umieszczeniem go na ładowarce. Więcej informacji znajdziesz w artykule Określanie stanu i typu dokowania oraz ich monitorowanie.