App Standby je mechanismus Androidu, který převádí zřídka používané aplikace do režimu čekání a omezuje jejich aktivitu na pozadí za účelem šetření baterie. Na rozdíl od Doze Mode (režimu spánku zařízení), App Standby pracuje na úrovni jednotlivých aplikací nezávisle na stavu obrazovky a pohybu. Podle specifikace Android Developers, 2025 může App Standby snížit spotřebu energie zřídka používaných aplikací až o 70% blokováním jejich práce na pozadí.
Hlavní body
App Standby je součást systému správy energie Androidu, zavedená v Android 6.0 (API 23) a výrazně přepracovaná v Android 9 (API 28). Jejím úkolem je určit, které aplikace uživatel používá zřídka, a omezit jejich aktivitu na pozadí: síťové požadavky, synchronizaci, JobScheduler a AlarmManager. Na rozdíl od Doze, App Standby nezávisí na stavu obrazovky nebo pohybu zařízení.
Systém klasifikuje aplikace do čtyř bucketů (úrovní): Active, Working Set, Frequent a Rare. Každá úroveň určuje, jak moc je aktivita na pozadí omezena. Přechod mezi úrovněmi probíhá automaticky na základě vzorců používání aplikace: jak často ji uživatel otevírá, dostává oznámení, interaguje s widgety.
App Standby pracuje společně s Doze Mode, ale nenahrazuje jej. Pokud Doze omezuje aktivitu na pozadí všech aplikací při nečinnosti zařízení, App Standby omezuje konkrétní aplikace nezávisle na stavu zařízení. Aplikace s úrovní Rare bude mít omezení i při aktivním používání telefonu, pokud ji uživatel několik dní neotevřel.
Od Android 9 (API 28) společnost Google zavedla App Standby Buckets — formální klasifikaci s číselnými hodnotami. Systém používá strojové učení k predikci dalšího spuštění aplikace. Pokud model předpovídá, že aplikace bude otevřena v následujících hodinách, obdrží bucket Active. Pokud predikce ukazuje na vzácné používání — je přiřazen Rare.
App Standby analyzuje několik faktorů pro určení bucketu: čas od posledního otevření aplikace uživatelem, frekvenci interakce (počet spuštění za den/týden), příjem FCM oznámení, přítomnost aktivních widgetů na ploše a předplatné AlarmManageru. Čím déle se aplikace nepoužívá, tím nižší je její bucket a tím přísnější jsou omezení.
Systémová služba UsageStatsManager shromažďuje statistiky používání aplikací a předává je StandbyControlleru — součásti frameworku, která vypočítává bucket pro každou aplikaci. StandbyController také zohledňuje systémové události: po aktualizaci aplikace se její bucket na několik dní resetuje na Active, aby uživatel mohl vyhodnotit nové funkce.
Důležitá vlastnost: App Standby nezabíjí proces aplikace, ale omezuje její možnosti na pozadí. Aplikace nadále funguje, pokud s ní uživatel interaguje (bucket Active). Jakmile uživatel aplikaci minimalizuje a nevrátí se k ní, systém začne počítat dobu nečinnosti a může snížit bucket na Working Set nebo Frequent.
Příjem zprávy FCM high-priority může dočasně zvýšit bucket aplikace na Active. To dává aplikaci možnost provést úlohu (zpracovat zprávu, synchronizovat data) bez omezení. Po dokončení zpracování se však bucket vrací na původní hodnotu. Google doporučuje používat tento mechanismus pro doručování důležitých oznámení, nikoli pro udržování aplikace “naživu”.
App Standby používá čtyři úrovně (bucket) pro klasifikaci aplikací. Každá úroveň určuje dobu zpoždění pro úlohy na pozadí: čím nižší úroveň, tím delší zpoždění. Systém automaticky přesouvá aplikaci mezi úrovněmi na základě statistik používání shromážděných za posledních 7–14 dní.
| Bucket | Popis | Zpoždění JobScheduleru | Síť |
|---|---|---|---|
| Active | Aplikace je aktivně používána | Žádné zpoždění | Plný přístup |
| Working Set | Používána pravidelně, ale nyní ne | Až 2 hodiny | V oknech |
| Frequent | Často používána, ale ne denně | Až 4 hodiny | V oknech |
| Rare | Zřídka používaná aplikace | Až 24 hodin | V oknech |
Active — aplikace, se kterou uživatel nedávno interagoval (spustil, obdržel oznámení nebo použil widget). V tomto bucketu nejsou žádná omezení: JobScheduler se spouští okamžitě, síť je k dispozici, AlarmManager funguje přesně. Aplikace zůstává v Active, dokud uživatel nepřestane s ní interagovat po dobu několika hodin.
Working Set — aplikace je používána pravidelně (několikrát týdně). Zpoždění úloh na pozadí až 2 hodiny. Frequent — aplikace je používána několikrát měsíčně. Zpoždění až 4 hodiny. Na obou úrovních je síť k dispozici pouze v oknech údržby a AlarmManager může být zpožděn. JobScheduler provádí úlohy v nejbližším okně.
Rare — nejpřísnější úroveň, přiřazená aplikacím, které uživatel neotevřel déle než 30 dní. Zpoždění úloh na pozadí dosahuje 24 hodin. Síť je zcela blokována mimo okna údržby, AlarmManager funguje pouze s příznaky setAndAllowWhileIdle() s omezením 1krát za 9 minut. Oznámení FCM high-priority jsou stále doručována, ale nemohou zvýšit bucket.
App Standby ukládá omezení na několik kategorií operací na pozadí. Na rozdíl od Doze, omezení App Standby fungují nezávisle na stavu obrazovky a nabíječky. Vývojář by měl navrhovat aplikaci s ohledem na tato omezení, zejména pokud cílová skupina používá aplikaci nepravidelně.
JobScheduler — hlavní API, na které App Standby působí. V závislosti na bucketu se zpoždění provádění úloh pohybuje od 2 do 24 hodin. WorkManager, který používá JobScheduler pod kapotou (na API 23+), rovněž podléhá těmto zpožděním. Pro časově kritické úlohy použijte Expedited Work, který spouští Foreground Service pod kapotou a nezávisí na bucketu.
Aplikace v bucketu Working Set, Frequent a Rare nemohou provádět libovolné síťové požadavky kdykoli. Systém povoluje přístup k síti pouze v oknech údržby synchronizovaných s Doze. Pro odesílání kritických dat použijte FCM high-priority s následnou synchronizací v okně údržby.
AlarmManager v App Standby podléhá stejným pravidlům jako v Doze: přesné budíky (setExact()) jsou zpožděny a setAndAllowWhileIdle() je omezen na 1 spuštění za 9 minut. Pro bucket Rare může zpoždění dosáhnout 24 hodin, což činí AlarmManager nevhodným pro přesné plánování úloh ve zřídka používaných aplikacích.
Výjimku z App Standby lze získat dvěma způsoby: prostřednictvím uživatelských nastavení baterie (ruční Whitelist) nebo prostřednictvím systémového Intentu ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS. Google však přísně reguluje přístup k výjimkám — aplikace, které nemají závažný důvod pro výjimku, riskují zamítnutí v Obchodě Google Play.
Uživatel může ručně zakázat omezení pro konkrétní aplikaci prostřednictvím Nastavení → Aplikace → [Aplikace] → Baterie → Optimalizace → Neoptimalizovat. To zcela odstraní omezení App Standby a Doze pro vybranou aplikaci. Vývojář může uživateli zobrazit instrukci nebo systémový dialog, ale nemůže aplikaci násilně přidat do výjimek.
Foreground Service s oznámením automaticky získává dočasnou výjimku z App Standby. Dokud služba běží a zobrazuje oznámení, je aplikace převedena do bucketu Active bez ohledu na její skutečnou úroveň. Po zastavení služby se bucket vrací na původní hodnotu. Toto je nejspolehlivější způsob, jak zaručit práci na pozadí bez žádání o systémové výjimky.
Žádost o Whitelist má smysl pouze pro aplikace s kriticky důležitou funkcionalitou na pozadí: navigace v reálném čase, monitorování zdraví, VoIP hovory, ochrana zařízení. Pro většinu aplikací stačí použít Foreground Service nebo WorkManager. Google Play může odmítnout publikaci, pokud aplikace žádá o výjimku bez zjevné potřeby.
// Žádost o výjimku z App Standby
val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply {
data = Uri.parse("package:\${applicationContext.packageName}")
}
// Kontrola aktuálního stavu
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
val isIgnoring = powerManager.isIgnoringBatteryOptimizations(packageName)
Testování App Standby přes ADB umožňuje násilně přiřadit aplikaci libovolný bucket a zkontrolovat její chování. To je kritické pro aplikace, které spoléhají na synchronizaci na pozadí, oznámení nebo pravidelné aktualizace. Testování by mělo být prováděno na fyzickém zařízení nebo emulátoru s Android 9+.
Pro násilné nastavení bucketu se používá příkaz adb shell am set-standby-bucket [package] [bucket], kde bucket může být: active, working_set, frequent nebo rare. Pro zobrazení aktuálního bucketu — adb shell am get-standby-bucket [package]. Systém také umožňuje simulaci dlouhodobé nečinnosti aplikace pomocí příkazu adb shell dumpsys usagestats.
# Nastavení bucketu Rare pro aplikaci
$ adb shell am set-standby-bucket com.example.app rare
# Zobrazení aktuálního bucketu
$ adb shell am get-standby-bucket com.example.app
# Reset všech bucketů na Active
$ adb shell dumpsys usagestats clear
# Zobrazení všech bucketů systému
$ adb shell dumpsys usagestats
Po nastavení bucketu Rare zkontrolujte: zda se úloha WorkManager provádí do 24 hodin, zda se AlarmManager spouští, zda jsou oznámení FCM doručována, zda Foreground Service funguje bez omezení. WorkManager s politikou Expedited Work by se měl provést okamžitě i v bucketu Rare, protože používá Foreground Service. Běžné úlohy WorkManager budou zpožděny podle bucketu.
Vývoj aplikace odolné vůči App Standby vyžaduje vědomý přístup k úlohám na pozadí. Základní princip: nepředpokládejte, že aplikace je vždy v bucketu Active. Navrhněte práci na pozadí tak, aby správně fungovala se zpožděními charakteristickými pro bucket Frequent a Rare.
Expedited Work (WorkManager 2.7+) spouští Foreground Service pod kapotou, což dává úloze okamžité provedení nezávisle na bucketu. To je optimální volba pro úlohy, které nelze zpozdit: odeslání zprávy, synchronizace po platbě, zpracování příchozího hovoru. Běžné úlohy WorkManager se provádějí v oknech údržby s ohledem na bucket.
Používejte zprávy FCM high-priority k probuzení aplikace z App Standby. Když aplikace obdrží takovou zprávu, její bucket se dočasně zvýší na Active a může provést potřebné úlohy (synchronizace, aktualizace dat). Po dokončení zpracování se bucket vrací na původní úroveň.
Nepokoušejte se obejít App Standby pomocí trvalých služeb na pozadí, WakeLock nebo pravidelných FCM zpráv. Google aktivně bojuje proti takovým praktikám — aplikace může být označena jako energeticky náročná a omezena ještě přísněji. Používejte WorkManager pro pravidelné úlohy a Foreground Service pouze tehdy, když je úloha skutečně viditelná pro uživatele.
Často kladené otázky
App Standby je mechanismus Androidu, který klasifikuje aplikace podle frekvence používání a omezuje aktivitu na pozadí zřídka používaných. Na rozdíl od Doze, App Standby pracuje na úrovni aplikace nezávisle na stavu obrazovky a pohybu zařízení.
Existují 4 úrovně: Active (bez omezení), Working Set (zpoždění až 2 hodiny), Frequent (zpoždění až 4 hodiny) a Rare (zpoždění až 24 hodin). Úroveň je určena automaticky na základě frekvence používání aplikace.
App Standby omezuje konkrétní zřídka používané aplikace nezávisle na stavu zařízení. Doze Mode omezuje všechny aplikace při nečinnosti zařízení (vypnutá obrazovka, žádný pohyb). Pracují paralelně a vzájemně se doplňují v systému úspory energie Androidu.
Použijte příkaz ADB: adb shell am get-standby-bucket [package]. Programově — přes UsageStatsManager.getAppStandbyBucket(), dostupné od Android 9 (API 28). Metoda vrací číselný identifikátor bucketu: 10 (Active), 20 (Working Set), 30 (Frequent), 40 (Rare).
Použijte WorkManager Expedited Work nebo Foreground Service s oznámením. Expedited Work spouští Foreground Service pod kapotou a zaručuje provedení nezávisle na bucketu. Běžné úlohy WorkManager budou zpožděny podle aktuální úrovně aplikace.
Shrnutí
adb shell am set-standby-bucket pro kontrolu chování na každé úrovniVyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také