App Standby је Android механизам који пребацује ретко коришћене апликације у режим чекања, ограничавајући њихову позадинску активност ради уштеде батерије. За разлику од Doze Mode (режима спавања уређаја), App Standby ради на нивоу појединачних апликација независно од стања екрана и покрета. Према спецификацији Android Developers, 2025, App Standby може смањити потрошњу енергије ретко коришћених апликација до 70% блокирањем њиховог позадинског рада.
Главне тачке
App Standby је компонента система управљања енергијом Android-а, уведена у Android 6.0 (API 23) и значајно прерађена у Android 9 (API 28). Њен задатак је да утврди које апликације корисник ретко користи и ограничи њихову позадинску активност: мрежне захтеве, синхронизацију, JobScheduler и AlarmManager. За разлику од Doze-а, App Standby не зависи од стања екрана или покрета уређаја.
Систем класификује апликације у четири bucket (нивоа): Active, Working Set, Frequent и Rare. Сваки ниво одређује колико је позадинска активност ограничена. Прелазак између нивоа се одвија аутоматски на основу образаца коришћења апликације: колико често је корисник отвара, прима обавештења, интерагује са виџетима.
App Standby ради у пару са Doze Mode, али га не замењује. Ако Doze ограничава позадинску активност свих апликација када је уређај неактиван, App Standby ограничава конкретне апликације независно од стања уређаја. Апликација са нивоом Rare имаће ограничења чак и при активном коришћењу телефона, ако је корисник није отварао неколико дана.
Од Android 9 (API 28) па надаље, Google је увео App Standby Buckets — формалну класификацију са нумеричким вредностима. Систем користи машинско учење за предвиђање следећег покретања апликације. Ако модел предвиђа да ће апликација бити отворена у наредним сатима, добија bucket Active. Ако предвиђање указује на ретко коришћење — додељује се Rare.
App Standby анализира неколико фактора за одређивање bucket-а: време од последњег отварања апликације од стране корисника, учесталост интеракције (број покретања дневно/недељно), примање FCM обавештења, присуство активних виџета на радној површини и претплату на AlarmManager. Што се апликација дуже не користи, то је њен bucket нижи и ограничења строжа.
Системски сервис UsageStatsManager прикупља статистику коришћења апликација и прослеђује је StandbyController-у — компоненти оквира која израчунава bucket за сваку апликацију. StandbyController такође узима у обзир системске догађаје: након ажурирања апликације, њен bucket се ресетује на Active на неколико дана како би корисник могао да оцени нове функције.
Важна карактеристика: App Standby не убија процес апликације, већ ограничава њене позадинске могућности. Апликација наставља да ради ако корисник интерагује са њом (bucket Active). Чим корисник minimizuje апликацију и не врати јој се, систем почиње да броји време неактивности и може спустити bucket на Working Set или Frequent.
Примање FCM high-priority поруке може привремено подићи bucket апликације на Active. Ово даје апликацији могућност да изврши задатак (обради поруку, синхронизује податке) без ограничења. Међутим, након завршетка обраде, bucket се враћа на првобитну вредност. Google препоручује коришћење овог механизма за доставу важних обавештења, а не за одржавање апликације „живом”.
App Standby користи четири нивоа (bucket) за класификацију апликација. Сваки ниво одређује време кашњења за позадинске задатке: што је нижи ниво, то је кашњење дуже. Систем аутоматски помера апликацију између нивоа на основу статистике коришћења прикупљене у последњих 7–14 дана.
| Bucket | Опис | Кашњење JobScheduler-а | Мрежа |
|---|---|---|---|
| Active | Апликација се активно користи | Без кашњења | Потпун приступ |
| Working Set | Користи се редовно, али не сада | До 2 сата | У прозорима |
| Frequent | Често се користи, али не свакодневно | До 4 сата | У прозорима |
| Rare | Ретко коришћена апликација | До 24 сата | У прозорима |
Active — апликација са којом је корисник недавно интераговао (покренуо је, примио обавештење или користио виџет). У овом bucket-у нема ограничења: JobScheduler се покреће одмах, мрежа је доступна, AlarmManager ради прецизно. Апликација остаје у Active док корисник не престане да интерагује са њом неколико сати.
Working Set — апликација се користи редовно (неколико пута недељно). Кашњење позадинских задатака до 2 сата. Frequent — апликација се користи неколико пута месечно. Кашњење до 4 сата. На оба нивоа, мрежа је доступна само у прозорима одржавања, а AlarmManager може бити одложен. JobScheduler извршава задатке у најближем прозору.
Rare — најстрожи ниво, додељен апликацијама које корисник није отварао више од 30 дана. Кашњење позадинских задатака достиже 24 сата. Мрежа је потпуно блокирана ван прозора одржавања, AlarmManager ради само са заставицама setAndAllowWhileIdle() са ограничавањем 1 пут у 9 минута. FCM high-priority обавештења се и даље достављају, али не могу подићи bucket.
App Standby намеће ограничења на неколико категорија позадинских операција. За разлику од Doze-а, ограничења App Standby-ја делују независно од стања екрана и пуњача. Програмер треба да дизајнира апликацију узимајући у обзир ова ограничења, посебно ако циљна публика користи апликацију нередовно.
JobScheduler — главни API на који App Standby утиче. У зависности од bucket-а, кашњење извршења задатака износи од 2 до 24 сата. WorkManager, који користи JobScheduler испод хаубе (на API 23+), такође подлеже овим кашњењима. За временски критичне задатке користите Expedited Work, који покреће Foreground Service испод хаубе и не зависи од bucket-а.
Апликације у bucket-у Working Set, Frequent и Rare не могу обављати произвољне мрежне захтеве у било ком тренутку. Систем дозвољава приступ мрежи само у прозорима одржавања који су синхронизовани са Doze-ом. За слање критичних података користите FCM high-priority са накнадном синхронизацијом у прозору одржавања.
AlarmManager у App Standby-ју подлеже истим правилима као и у Doze-у: прецизни аларми (setExact()) се одлажу, а setAndAllowWhileIdle() је ограничено на 1 окидање у 9 минута. За bucket Rare кашњење може достићи 24 сата, што чини AlarmManager непогодним за прецизно планирање задатака у ретко коришћеним апликацијама.
Изузеће из App Standby-ја може се добити на два начина: преко корисничких поставки батерије (ручни Whitelist) или преко системског Intent-а ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS. Међутим, Google строго регулише приступ изузећима — апликације које немају ваљан разлог за изузеће ризикују да буду одбијене на Google Play-у.
Корисник може ручно онемогућити ограничења за одређену апликацију преко Подешавања → Апликације → [Апликација] → Батерија → Оптимизација → Не оптимизуј. Ово потпуно уклања ограничења App Standby-ја и Doze-а за изабрану апликацију. Програмер може показати кориснику упутство или системски дијалог, али не може присилно додати апликацију у изузећа.
Foreground Service са обавештењем аутоматски добија привремено изузеће из App Standby-ја. Док сервис ради и приказује обавештење, апликација се пребацује у bucket Active без обзира на њен стварни ниво. Након заустављања сервиса, bucket се враћа на првобитну вредност. Ово је најпоузданији начин да се гарантује позадински рад без захтевања системских изузећа.
Захтевање Whitelist-а има смисла само за апликације са критично важном позадинском функционалношћу: навигација у реалном времену, праћење здравља, VoIP позиви, заштита уређаја. За већину апликација довољно је користити Foreground Service или WorkManager. Google Play може одбити објављивање ако апликација захтева изузеће без очигледне потребе.
// Захтев за изузеће из App Standby-ја
val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply {
data = Uri.parse("package:\${applicationContext.packageName}")
}
// Провера тренутног статуса
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
val isIgnoring = powerManager.isIgnoringBatteryOptimizations(packageName)
Тестирање App Standby-ја преко ADB-а омогућава присилно додељивање било ког bucket-а апликацији и проверу њеног понашања. Ово је критично за апликације које се ослањају на позадинску синхронизацију, обавештења или периодична ажурирања. Тестирање се мора обавити на физичком уређају или емулатору са Android 9+.
За присилно подешавање bucket-а користи се команда adb shell am set-standby-bucket [package] [bucket], где bucket може бити: active, working_set, frequent или rare. За преглед тренутног bucket-а — adb shell am get-standby-bucket [package]. Систем такође омогућава симулацију дуготрајне неактивности апликације преко команде adb shell dumpsys usagestats.
# Подешавање bucket Rare за апликацију
$ adb shell am set-standby-bucket com.example.app rare
# Преглед тренутног bucket-а
$ adb shell am get-standby-bucket com.example.app
# Ресетовање свих bucket-ова на Active
$ adb shell dumpsys usagestats clear
# Преглед свих bucket-ова система
$ adb shell dumpsys usagestats
Након подешавања bucket-а Rare проверите: да ли се WorkManager задатак извршава у року од 24 сата, да ли се AlarmManager окида, да ли се FCM обавештења достављају, да ли Foreground Service ради без ограничења. WorkManager са политиком Expedited Work треба да се изврши одмах чак и у bucket-у Rare, јер користи Foreground Service. Обични WorkManager задаци биће одложени у складу са bucket-ом.
Развој апликације отпорне на App Standby захтева свестан приступ позадинским задацима. Основни принцип: не претпостављати да је апликација увек у bucket-у Active. Дизајнирајте позадински рад тако да исправно функционише са кашњењима карактеристичним за bucket Frequent и Rare.
Expedited Work (WorkManager 2.7+) покреће Foreground Service испод хаубе, што задатку даје тренутно извршење независно од bucket-а. Ово је оптималан избор за задатке који не могу бити одложени: слање поруке, синхронизација након плаћања, обрада долазног позива. Обични WorkManager задаци се извршавају у прозорима одржавања узимајући у обзир bucket.
Користите FCM high-priority поруке за буђење апликације из App Standby-ја. Када апликација прими такву поруку, њен bucket се привремено подиже на Active и може извршити потребне задатке (синхронизација, ажурирање података). Након завршетка обраде, bucket се враћа на првобитни ниво.
Не покушавајте да заобиђете App Standby помоћу сталних позадинских сервиса, WakeLock-а или периодичних FCM порука. Google се активно бори против таквих пракси — апликација може бити означена као енергетски захтевна и ограничена још строже. Користите WorkManager за периодичне задатке и Foreground Service само када је задатак стварно видљив кориснику.
Често постављана питања
App Standby је Android механизам који класификује апликације према учесталости коришћења и ограничава позадинску активност ретко коришћених. За разлику од Doze-а, App Standby ради на нивоу апликације независно од стања екрана и покрета уређаја.
Постоје 4 нивоа: Active (без ограничења), Working Set (кашњење до 2 сата), Frequent (кашњење до 4 сата) и Rare (кашњење до 24 сата). Ниво се одређује аутоматски на основу учесталости коришћења апликације.
App Standby ограничава конкретне ретко коришћене апликације независно од стања уређаја. Doze Mode ограничава све апликације када је уређај неактиван (екран искључен, без покрета). Они раде паралелно и допуњују се у систему за уштеду енергије Android-а.
Користите ADB команду: adb shell am get-standby-bucket [package]. Програмски — преко UsageStatsManager.getAppStandbyBucket(), доступно од Android 9 (API 28). Метода враћа нумерички идентификатор bucket-а: 10 (Active), 20 (Working Set), 30 (Frequent), 40 (Rare).
Користите WorkManager Expedited Work или Foreground Service са обавештењем. Expedited Work покреће Foreground Service испод хаубе и гарантује извршење независно од bucket-а. Обични WorkManager задаци биће одложени у складу са тренутним нивоом апликације.
Резиме
adb shell am set-standby-bucket за проверу понашања на сваком нивоуРазвићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође