Když měníte frekvenci aktualizací na pozadí, abyste snížili vliv těchto aktualizací na životnost baterie, je dobré začít kontrolou aktuální úrovně baterie a stavu nabíjení.
Dopad provádění aktualizací aplikací na životnost baterie závisí na úrovni baterie a stavu nabíjení zařízení. Dopad provádění aktualizací, když se zařízení nabíjí přes AC, je zanedbatelný, takže ve většině případů můžete maximalizovat obnovovací frekvenci, kdykoli je zařízení připojeno k nástěnné nabíječce. Naopak, pokud se zařízení vybíjí, snížení rychlosti aktualizace pomáhá prodloužit životnost baterie.
Podobně můžete zkontrolovat úroveň nabití baterie a potenciálně snížit frekvenci – nebo dokonce zastavit – aktualizace, když je baterie téměř vybitá.
Určete aktuální stav nabíjení
Začněte určením aktuálního stavu nabití. BatteryManager vysílá všechny podrobnosti o baterii a nabíjení v lepivém Intent, který zahrnuje stav nabíjení.
Protože se jedná o fixní záměr, nemusíte registrovat BroadcastReceiver – pouhým zavoláním registerReceiver a předáním null jako přijímače, jak je znázorněno v dalším úryvku, se vrátí aktuální záměr stavu baterie. Zde můžete předat skutečný objekt BroadcastReceiver, ale aktualizace budeme zpracovávat v pozdější části, takže to není nutné.
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter);
Můžete extrahovat jak aktuální stav nabíjení, tak pokud se zařízení nabíjí, zda se nabíjí přes USB nebo AC nabíječku:
// Nabíjíme / nabíjíme? int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; // Jak nabíjíme? int chargePlug = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB; boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;
Obvykle byste měli maximalizovat rychlost aktualizací na pozadí v případě, že je zařízení připojeno k AC nabíječce, snížit rychlost, pokud je nabíjení přes USB, a dále ji snížit, pokud se vybíjí baterie.
Sledujte změny stavu nabíjení
Stav nabíjení se může měnit stejně snadno, jako lze zařízení zapojit do zásuvky, takže je důležité sledovat stav nabíjení kvůli změnám a podle toho upravit obnovovací frekvenci.
BatteryManager vysílá akci vždy, když je zařízení připojeno nebo odpojeno od napájení. Je důležité přijímat tyto události, i když vaše aplikace není spuštěna – zejména proto, že tyto události by měly mít vliv na to, jak často aplikaci spouštíte, aby bylo možné zahájit aktualizaci na pozadí – měli byste si tedy do manifestu zaregistrovat BroadcastReceiver, který bude naslouchat oběma událostem. definováním ACTION_POWER_CONNECTED a ACTION_POWER_DISCONNECTED v rámci filtru záměrů.
V rámci související implementace BroadcastReceiver můžete extrahovat aktuální stav nabíjení a metodu, jak je popsáno v předchozím kroku.
public class PowerConnectionReceiver rozšiřuje BroadcastReceiver >
Určete aktuální úroveň baterie
V některých případech je také užitečné zjistit aktuální úroveň baterie. Pokud je nabití baterie pod určitou úrovní, můžete se rozhodnout snížit rychlost aktualizací na pozadí.
Aktuální nabití baterie můžete zjistit extrahováním aktuální úrovně nabití baterie a stupnice ze záměru stavu baterie, jak je znázorněno zde:
int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1); plováková bateriePct = hladina / (plovoucí) stupnice;
Sledujte významné změny v úrovni baterie
Stav baterie nemůžete snadno neustále sledovat, ale není to nutné.
Obecně řečeno, dopad neustálého sledování úrovně baterie má větší dopad na baterii než běžné chování vaší aplikace, takže je dobrým zvykem sledovat pouze významné změny úrovně baterie – konkrétně když zařízení přejde do stavu nízkého nabití baterie nebo jej opustí.
Níže uvedený fragment manifestu je extrahován z prvku filtru záměru v přijímači vysílání. Přijímač se spustí vždy, když se baterie zařízení vybije nebo opustí stav vybití poslechem ACTION_BATTERY_LOW a ACTION_BATTERY_OKAY .
Obecně je dobrým zvykem zakázat všechny aktualizace na pozadí, když je baterie kriticky vybitá. Nezáleží na tom, jak čerstvá jsou vaše data, pokud se telefon sám vypne, než je budete moci používat.
V mnoha případech se nabíjení zařízení shoduje s jeho vložením do doku. Následující lekce vám ukáže, jak určit aktuální stav doku a sledovat změny v dokování zařízení.
Jak zjistím úroveň a stav baterie (připojeno, vybíjení, nabíjení atd.)? Prozkoumal jsem dokumentaci pro vývojáře a našel jsem třídu BatteryManager. Ale neobsahuje žádné metody, pouze konstanty. Jak to vůbec používám?
zeptal se 20. července 2010 ve 15:32
Mohit Deshpande Mohit Deshpande
54.3k 77 77 zlaté odznaky 194 194 stříbrné odznaky 253 253 bronzové odznaky
Po nějakém DALŠÍM zkoumání jsem našel BatteryManager.EXTRA_LEVEL.
20. července 2010 ve 15:46
12 odpovědi 12
Od SDK 21 LOLLIPOP je možné k získání aktuální úrovně baterie v procentech použít následující:
BatteryManager bm = (BatteryManager) context.getSystemService(BATTERY_SERVICE); int batLevel = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY); 8,527 8 8 zlaté odznaky 50 50 stříbrných odznaků 81 81 bronzových odznaků
odpověděl 21 v 2016:16
3,364 1 1 22 zlatý odznak 22 27 stříbrných odznaků 27 XNUMX bronzových odznaků
zapomněl jsi na stát?)
15. prosince 2023 ve 19:49
Tutoriál pro Android obsahuje ukázku kódu, která vysvětluje, jak získat informace o baterii.
Abychom to shrnuli, přijímač vysílání pro záměr ACTION_BATTERY_CHANGED je nastaven dynamicky, protože jej nelze přijímat prostřednictvím komponent deklarovaných v manifestech, pouze pokud se pro něj výslovně zaregistrujete pomocí Context.registerReceiver() .
public class Main extends Activity < private TextView batteryTxt; private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver()< @Override public void onReceive(Context ctxt, Intent intent) < int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level * 100 / (float)scale; batteryTxt.setText(String.valueOf(batteryPct) + "%"); >>; @Override public void onCreate(Bundle b) < super.onCreate(b); setContentView(R.layout.main); batteryTxt = (TextView) this.findViewById(R.id.batteryTxt); this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); >> 6,073 14 14 zlaté odznaky 31 31 stříbrných odznaků 58 58 bronzových odznaků
odpověděl 20 v 2010:15
41.9k 8 8 zlaté odznaky 86 86 stříbrné odznaky 100 100 bronzové odznaky
O Intent.ACTION_BATTERY_CHANGED: Toto je trvalé vysílání obsahující stav nabíjení, úroveň a další informace o baterii. Nemůžete to získat prostřednictvím komponent deklarovaných v manifestech, pouze pokud se pro to výslovně zaregistrujete pomocí Context.registerReceiver().
Květen 6, 2015 na 11: 44
@classAndroid dobře, ano, to je výslovně uvedeno v odpovědi.
Květen 6, 2015 na 12: 06
Ano @SirDarius, jen o tom dávám vědět ostatním. Nejprve jsem hlasoval pro vaši odpověď a když jsem to zjistil, přidal jsem tento komentář.
Květen 6, 2015 na 12: 52
nezapomeňte zrušit registraci přijímače při pozastavení nebo zničení.
5. července 2015 ve 19:02
Nedaří se mi nainstalovat správce baterie s novou Keywork , Proč pane ?
19. prosince 2019 ve 4:27
Na základě oficiálních dokumentů pro Android můžete tuto metodu použít ve třídě Helper nebo Util k získání aktuálního procenta baterie:
Java verze:
public static int getBatteryPercentage(Context context) < if (Build.VERSION.SDK_INT >= 21) < BatteryManager bm = (BatteryManager) context.getSystemService(BATTERY_SERVICE); return bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY); >else < IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, iFilter); int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1; int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1; double batteryPct = level / (double) scale; return (int) (batteryPct * 100); >> Kotlin verze:
fun getBatteryPercentage(context: Context): Int < return if (Build.VERSION.SDK_INT >= 21) < val bm = context.getSystemService(BATTERY_SERVICE) as BatteryManager bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) >else < val iFilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED) val batteryStatus: Intent = context.registerReceiver(null, iFilter) val level = batteryStatus?.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) val scale = batteryStatus?.getIntExtra(BatteryManager.EXTRA_SCALE, -1) val batteryPct = level / scale.toDouble() (batteryPct * 100).toInt() >> odpověděl 19. 2017. 12 v 55:XNUMX
5,273 1 1 40 zlatý odznak 40 60 stříbrných odznaků 60 XNUMX bronzových odznaků
jedna chyba v oficiálních dokumentech, musíte místo toho použít double float int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1; int scale = stav baterie != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1; dvojitá bateriePct = (dvojitá) úroveň / (dvojitá) stupnice; int procento = (int) (bateriePct * 100D);
4. srpna 2018 ve 13:41
@user2212515, nevadilo by vám upravit moji odpověď na základě oficiálních dokumentů?
4. srpna 2018 ve 17:49
@Ryan, upravil jsem svou odpověď tak, aby podporovala Android v21 a novější. Zkontrolujte to prosím.
19. listopadu 2019 ve 9:32
zapomněl jsi na stát?)
15. prosince 2023 ve 19:49
Nemusíte registrovat skutečný BroadcastReceiver, protože BatteryManager Androidu používá lepivý Intent:
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = registerReceiver(null, ifilter); int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level / (float)scale; return (int)(batteryPct*100); odpověděl 30. 2016. 17 v 58:XNUMX
3,051 1 1 34 zlatý odznak 34 28 stříbrných odznaků 28 XNUMX bronzových odznaků
Jiné odpovědi nezmiňovaly, jak získat přístup ke stavu baterie (nabíjení nebo ne).
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter); // 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; odpověděl 25. listopadu 2019 v 4:46
FindOutIslamNow FindOutIslamNow
1,185 1 1 15 zlatý odznak 15 34 stříbrných odznaků 34 XNUMX bronzových odznaků
Konečně někdo, kdo odpověděl na stav baterie
Dubna 8, v 2021 12: 26
Toto můžete použít k získání zbývající částky v procentech.
private void batteryLevel() < BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() < public void onReceive(Context context, Intent intent) < context.unregisterReceiver(this); int rawlevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); int level = -1; if (rawlevel >= 0 && scale > 0) < level = (rawlevel * 100) / scale; >batterLevel.setText("Battery Level Remaining: " + level + "%"); > >; IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); registerReceiver(batteryLevelReceiver, batteryLevelFilter); > odpověděl 5. listopadu 2015 v 21:12
6,028 48 48 stříbrných odznaků 39 39 bronzových odznaků
vyzkoušejte tuto funkci bez povolení nebo jakéhokoli přijímače
void getBattery_percentage() < IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = getApplicationContext().registerReceiver(null, ifilter); int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level / (float)scale; float p = batteryPct * 100; Log.d("Battery percentage",String.valueOf(Math.round(p))); > 













