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. BatteryManager
wyś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_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 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.