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 aktualizacji podczas ładowania urządzenia za pomocą prądu przemiennego jest znikoma, więc w większości przypadków możesz zmaksymalizować częstotliwość odświeżania, gdy podłączone jest urządzenie. do ładowarki sieciowej. 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

Zacznij od określenia bieżącego stanu nał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 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 zalecamy maksymalizację liczby aktualizacji w tle, jeśli urządzenie jest podłączone do ładowarki AC, zmniejsz szybkość, jeśli ładowanie odbywa się przez USB, i obniż je dalej, jeśli 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.

Urządzenie BatteryManager przesyła komunikat o działaniu za każdym razem, gdy jest podłączone lub odłączony od zasilania. Te zdarzenia są ważne nawet wtedy, gdy aplikacja nie jest aktywnych użytkowników, zwłaszcza, że te zdarzenia powinny wpływać na częstotliwość uruchamiania aplikacji zainicjuj aktualizację w tle, dlatego zarejestruj w pliku manifestu element BroadcastReceiver, aby nasłuchiwać obu zdarzeń przez zdefiniowanie parametru ACTION_POWER_CONNECTED i ACTION_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 warto też określić bieżący poziom baterii. Możesz zmniejszyć częstotliwość aktualizacji w tle, jeśli poziom naładowania baterii spadnie poniżej określonego poziomu.

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;

Reagowanie 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 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ś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 aktualne są dane, jeśli telefon wyłączy się przed Tobą jak z niego korzystać. 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 wynikiem przypadku umieszczenia go w stacji dokującej. Następny lekcja pokazuje, jak określić bieżący stan stacji dokującej i monitorować zmiany w urządzeniu zadokowania.