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