اندروید ۹ (سطح API 28) و نسخههای جدیدتر از App Standby Buckets پشتیبانی میکنند. App Standby Buckets به سیستم کمک میکند تا درخواستهای برنامهها برای منابع را بر اساس اینکه اخیراً و چقدر مکرراً از برنامهها استفاده میشود، اولویتبندی کند. بر اساس الگوهای استفاده از برنامه، هر برنامه در یکی از پنج سطل اولویت قرار میگیرد. سیستم منابع دستگاه موجود برای هر برنامه را بر اساس سطلی که برنامه در آن قرار دارد، محدود میکند.
سطلهای اولویتدار
سیستم به صورت پویا هر برنامه را به یک دسته اولویتدار اختصاص میدهد و در صورت نیاز برنامهها را مجدداً اختصاص میدهد. این سیستم ممکن است به یک برنامه از پیش بارگذاری شده متکی باشد که از یادگیری ماشینی برای تعیین احتمال استفاده از هر برنامه استفاده میکند و برنامهها را به دستههای مناسب اختصاص میدهد.
اگر برنامه سیستمی روی دستگاهی وجود نداشته باشد، سیستم به طور پیشفرض برنامهها را بر اساس آخرین استفاده مرتب میکند. برنامههایی که فعالتر هستند به سطلهایی اختصاص داده میشوند که به آنها اولویت بالاتری میدهد و منابع سیستمی بیشتری را در اختیار برنامه قرار میدهد. به طور خاص، سطل تعیین میکند که وظایف برنامه چند بار اجرا شود و برنامه چند بار میتواند آلارمها را فعال کند. این محدودیتها فقط در زمانی اعمال میشوند که دستگاه با باتری کار میکند. در حالی که دستگاه در حال شارژ است، سیستم این محدودیتها را اعمال نمیکند.
سطلهای اولویتدار به شرح زیر هستند:
- فعال : برنامه در حال استفاده است یا اخیراً استفاده شده است.
- تنظیمات کار : برنامه به طور منظم در حال استفاده است.
- مکرر : برنامه اغلب استفاده میشود اما نه روزانه.
- نادر : برنامه به طور مکرر استفاده نمیشود.
- محدود شده : برنامه منابع سیستم زیادی را مصرف میکند یا ممکن است رفتار نامطلوبی از خود نشان دهد.
علاوه بر این سطلهای اولویتدار، یک سطل ویژه «هرگز » برای برنامههایی که نصب شدهاند اما هرگز اجرا نشدهاند وجود دارد. سیستم محدودیتهای شدیدی را برای این برنامهها اعمال میکند.
توضیحات زیر برای حالت غیر پیشبینیکننده است. در مقابل، وقتی پیشبینی از یادگیری ماشین برای پیشبینی رفتار استفاده میکند، سطلها بر اساس پیشبینی اقدامات بعدی کاربر انتخاب میشوند، نه بر اساس استفاده اخیر. به عنوان مثال، یک برنامه اخیراً استفاده شده ممکن است در سطل نادر قرار گیرد زیرا یادگیری ماشین پیشبینی میکند که ممکن است برنامه برای چند ساعت استفاده نشود.
فعال
یک برنامه در زمانی که در حال استفاده است، اخیراً استفاده شده است یا هر یک از موارد زیر را انجام میدهد، در سطل فعال قرار دارد:
- فعالیتی را آغاز میکند.
- یک سرویس پیشزمینه طولانیمدت را اجرا میکند.
- توسط کاربر از طریق اعلان لمس میشود.
اگر برنامهای در سطل فعال باشد، سیستم محدودیتهای حداقلی را روی کارها یا هشدارهای برنامه اعمال میکند:
- از اندروید ۱۶ (سطح API ۳۶)، وظایف پسزمینه اگر توسط یک برنامه در سطل فعال شروع شوند، سهمیه زمان اجرای سخاوتمندانهای دارند. این شامل وظایفی میشود که مستقیماً با
JobSchedulerزمانبندی شدهاند، و همچنین وظایفی که توسط کتابخانههای دیگر مانند WorkManager یاDownloadManagerایجاد شدهاند.
تعامل کاربر، برنامهها را به عنوان فعال تعیین میکند
در اندروید ۹ (سطح API 28) و بالاتر، وقتی کاربر به روشهای خاصی با برنامه شما تعامل میکند، سیستم بهطور موقت برنامه شما را در سطل فعال قرار میدهد. پس از اینکه کاربر تعامل با برنامه شما را متوقف کرد، سیستم آن را بر اساس سابقه استفاده در سطل دیگری قرار میدهد.
نمونههایی از تعاملاتی که این رفتار سیستم را تحریک میکنند، در زیر آمده است:
کاربر روی اعلانی که برنامه شما ارسال میکند، ضربه میزند.
کاربر با ضربه زدن روی یک دکمه رسانه، با یک سرویس پیشزمینه در برنامه شما تعامل میکند.
کاربر هنگام تعامل با سیستم عامل اندروید اتوموتیو ، که در آن برنامه شما یا از یک سرویس پیشزمینه یا
CONNECTION_TYPE_PROJECTIONاستفاده میکند، به برنامه شما متصل میشود.
مجموعه کاری
یک برنامه اگر اغلب اجرا شود اما فعال نباشد، در سطل مجموعه کاری قرار دارد. به عنوان مثال، یک برنامه رسانه اجتماعی که کاربر تقریباً هر روز آن را اجرا میکند، احتمالاً در سطل مجموعه کاری قرار دارد. برنامهها همچنین اگر به طور غیرمستقیم مورد استفاده قرار گیرند، به سطل مجموعه کاری ارتقا مییابند.
اگر برنامهای در مجموعه کاری باشد، سیستم محدودیتهای خفیفی بر توانایی آن در اجرای کارها و فعال کردن آلارمها اعمال میکند. برای جزئیات بیشتر، به محدودیتهای منابع مدیریت نیرو مراجعه کنید.
مکرر
یک اپلیکیشن اگر به طور منظم اما نه لزوماً هر روز استفاده شود، در دستهی اپلیکیشنهای پرتکرار قرار میگیرد. برای مثال، یک اپلیکیشن ردیابی تمرینات ورزشی که کاربر در باشگاه اجرا میکند، ممکن است در دستهی اپلیکیشنهای پرتکرار قرار گیرد.
اگر یک برنامه در دسته برنامههای پرتکرار قرار داشته باشد، سیستم محدودیتهای قویتری بر توانایی آن در اجرای کارها و فعال کردن آلارمها اعمال میکند. برای جزئیات بیشتر، به محدودیتهای منابع مدیریت نیرو مراجعه کنید.
نادر
یک اپلیکیشن اگر زیاد مورد استفاده قرار نگیرد، در دسته اپلیکیشنهای کمیاب قرار میگیرد. برای مثال، اپلیکیشن یک هتل که کاربر فقط هنگام اقامت در آن هتل آن را اجرا میکند، ممکن است در دسته اپلیکیشنهای کمیاب قرار گیرد.
اگر یک برنامه در دستهی برنامههای کمیاب قرار گیرد، سیستم محدودیتهای شدیدی بر توانایی آن در اجرای کارها و فعال کردن آلارمها اعمال میکند. سیستم همچنین توانایی برنامه را برای اتصال به اینترنت محدود میکند. برای جزئیات بیشتر، به محدودیتهای منابع مدیریت انرژی مراجعه کنید.
محدود شده
این سطل که در اندروید ۱۲ (سطح API 31) اضافه شده است، کمترین اولویت و بالاترین محدودیت را در بین تمام سطلها دارد. سیستم، رفتار برنامه شما، مانند تعداد دفعات تعامل کاربر با آن، را در نظر میگیرد تا تصمیم بگیرد که آیا برنامه شما را در سطل محدود قرار دهد یا خیر.
در اندروید ۱۳ (سطح API ۳۳) و بالاتر، مگر اینکه برنامه شما واجد شرایط معافیت باشد، سیستم در شرایط زیر برنامه شما را در دسته محدود قرار میدهد:
کاربر برای تعداد مشخصی روز با برنامه شما تعامل ندارد. در اندروید ۱۲ (سطح API 31) و ۱۲L (سطح API 32)، تعداد روزها ۴۵ است. اندروید ۱۳ تعداد روزها را به ۸ کاهش میدهد.
برنامه شما در طول یک دوره ۲۴ ساعته تعداد زیادی broadcast یا binding را فراخوانی میکند.
اگر سیستم برنامه شما را در سطل محدود قرار دهد، محدودیتهای زیر اعمال میشود:
- شما میتوانید کارها را روزی یک بار در یک جلسه ۱۰ دقیقهای دسته بندی شده اجرا کنید . در طول این جلسه، سیستم کارهای برنامه شما را با کارهای برنامههای دیگر گروه بندی میکند.
- کارهای محدود شده به خودی خود اجرا نمیشوند. باید حداقل یک کار دیگر همزمان در حال اجرا یا در انتظار اجرا باشد که میتواند شامل هر کار دیگری باشد.
- برنامه شما میتواند کارهای تسریعشده کمتری را اجرا کند، در مقایسه با زمانی که سیستم برنامه شما را در یک سطل با محدودیت کمتر قرار میدهد.
- برنامه شما میتواند روزانه یک آلارم (هشدار) فراخوانی کند. این آلارم میتواند یک آلارم دقیق یا یک آلارم غیردقیق باشد.
معافیتها از سبد محدود شده
انواع برنامههای زیر از ورود به سطل محدود معاف هستند و حتی در اندروید ۱۲ و بالاتر، از ماشه غیرفعال بودن عبور میکنند:
- برنامههای دستگاه همراه
- برنامههای در حال اجرا روی دستگاه در حالت نمایشی
- برنامههای مالک دستگاه
- برنامههای مالک پروفایل
- برنامههای پایدار
- برنامههای VPN
- برنامههایی که نقش
ROLE_DIALERرا دارند - برنامههایی که کاربر صراحتاً در تنظیمات سیستم، عملکرد «نامحدود» را برای آنها تعیین کرده است
- برنامههایی با ویجتهای فعال
- برنامههایی که حداقل یکی از مجوزهای زیر را دارند:
اولویت را ارزیابی کنید
برای بررسی اینکه برنامه شما به کدام باکت اختصاص داده شده است، یکی از موارد زیر را انجام دهید:
تابع
getAppStandbyBucket()فراخوانی کنید.دستور زیر را در یک پنجره ترمینال اجرا کنید:
adb shell am get-standby-bucket PACKAGE_NAME
هر زمان که برنامه شما در سطل آماده به کار برنامهای قرار گیرد که مقدار آن بیشتر از STANDBY_BUCKET_ACTIVE (10) باشد، سیستم آن را مسدود میکند.
بهترین شیوهها
اگر برنامه شما از بهترین شیوهها برای Doze و حالت آماده به کار برنامه پیروی میکند، ویژگیهای مدیریت باتری بعدی دشوار نیستند. با این حال، برخی از رفتارهای برنامه که قبلاً به خوبی کار میکردند، ممکن است مشکلاتی ایجاد کنند.
- سعی نکنید سیستم را دستکاری کنید تا برنامه شما را در یک دسته خاص قرار دهد. روش سیستم برای قرار دادن اولویت میتواند تغییر کند و هر سازنده دستگاه ممکن است تصمیم بگیرد برنامه دسته بندی خود را با الگوریتم خاص خود بنویسد. در عوض، مطمئن شوید که برنامه شما صرف نظر از اینکه در کدام دسته قرار دارد، به طور مناسب رفتار میکند.
- اگر یک برنامه اکتیویتی لانچر نداشته باشد، ممکن است هرگز به سطل فعال ارتقا پیدا نکند. طراحی مجدد برنامه خود را برای داشتن چنین اکتیویتی در نظر بگیرید.
اگر کاربران نتوانند با اعلانهای برنامه تعامل داشته باشند، نمیتوانند برنامه را به بخش فعال منتقل کنند. در این صورت، طراحی مجدد برخی از اعلانها را که به کاربران امکان تعامل میدهند، در نظر بگیرید. برای برخی از دستورالعملها، به الگوهای طراحی اعلانهای طراحی متریال مراجعه کنید.
اگر برنامه هنگام دریافت پیام Firebase Cloud Messaging (FCM) با اولویت بالا، اعلانی نشان ندهد، کاربر نمیتواند با برنامه تعامل داشته باشد و بنابراین آن را به سطل فعال منتقل کند. در واقع، تنها کاربرد در نظر گرفته شده برای پیامهای FCM با اولویت بالا، ارسال اعلان به کاربر است، بنابراین این وضعیت نباید رخ دهد. در نسخه ۱۲L (سطح API 32) و پایینتر، اگر یک پیام FCM را به طور نامناسبی به عنوان اولویت بالا علامتگذاری کنید، در حالی که باعث تعامل کاربر نمیشود، میتواند باعث شود پیامهای آینده از اولویت خارج شوند.
اگر برنامهها در چندین بسته تقسیم شده باشند، ممکن است آن بستهها در سطلهای مختلف باشند و سطوح دسترسی متفاوتی داشته باشند. این برنامهها را با بستههای اختصاص داده شده به سطلهای مختلف آزمایش کنید تا مطمئن شوید که برنامه به درستی رفتار میکند.