برای بهبود عمر باتری دستگاه، Android میتواند با پایش استفاده از دستگاه و بیداری بر وضعیت دستگاه تأثیر بگذارد. پلاتفرم میتواند وارد حالت خواب شود تا فعالیتها را در زمانی که از دستگاه استفاده نمیشود موقتاً متوقف کند.
درباره Doze
«حالت آمادهبهکار» با بهتعویق انداختن فعالیت CPU و شبکه پسزمینه برنامه در زمانی که دستگاه برای مدت طولانی استفاده نمیشود، عمر باتری را افزایش میدهد.
دستگاههای غیرفعال در «حالت خواب» بهطور دورهای وارد پنجره نگهداری میشوند که درطول آن برنامهها میتوانند کارهای معلقه (همگامسازیها، کارها، و غیره) را تکمیل کنند. «حالت آمادهبهکار» سپس برای مدت طولانیتری به حالت خواب میرود و پساز آن پنجره نگهداری دیگری باز میشود. پلاتفرم به توالی خواب/نگهداری «حالت آمادهبهکار» ادامه میدهد و هر بار طول زمان آمادهبهکار را افزایش میدهد تا به حداکثر چند ساعت زمان خواب برسد. دستگاه در حالت «چرت» همیشه نسبتبه حرکت حساس است و اگر حرکتی تشخیص داده شود، بلافاصله از حالت «چرت» خارج میشود.
Android 7.0 و نسخههای بالاتر «حالت آمادهبهکار» را گسترش میدهد تا هر بار که کاربر صفحهنمایش دستگاه را خاموش میکند، حتی اگر کاربر به حرکت ادامه دهد، مجموعه سبکتری از بهینهسازیها را راهاندازی کند و درنتیجه عمر باتری طولانیتر شود.
خدمات سیستم حیاتی معمولاً توسط سازندگان دستگاه طوری تنظیم میشوند که از حالت «بهخواب رفتن» معاف باشند. کاربران همچنین میتوانند برنامههای خاصی را بااستفاده از منو «تنظیمات» از «حالت خواب» مستثنا کنند. بااینحال، مستثنا کردن برنامهها ممکن است باعث خالی شدن شارژ باتری دستگاه شود. بهطور پیشفرض، «حالت خواب» در AOSP غیرفعال است؛ برای جزئیات فعال کردن «حالت خواب»، ادغام «حالت خواب» را ببینید.
الزامات حالت «خوابآلود»
پشتیبانی از حالت «بهخواب رفتن» مستلزم این است که دستگاه سرویس پیامرسانی ابری داشته باشد، مثلاً پیامرسانی ابریِ Firebase (FCM). رویدادهای راهانداز خارجی، مثل پیامهای ابری، میتوانند بهطور موقت برنامهها را بیدار کنند تا درحالیکه دستگاه در حالت «بهخواب رفتن» است کار کنند.
پشتیبانی کامل از «حالت خواب» همچنین به آشکارساز حرکت قابلتوجه (SMD) در دستگاه نیاز دارد؛ بااینحال، حالت خواب سبک در Android 7.0 و بالاتر به SMD نیاز ندارد. اگر «حالت خواب» در دستگاهی فعال باشد که:
- دارای SMD باشد، بهینهسازیهای کامل «حالت خواب» انجام میشود (شامل بهینهسازیهای سبکوزن).
- SMD ندارد، فقط بهینهسازیهای سبک Doze انجام میشود.
چرخه حیات حالت «چرت زدن»
«چرت زدن» زمانی شروع میشود که پلاتفرم تشخیص دهد دستگاه غیرفعال است و زمانی پایان مییابد که یک یا چند فعالیت معیار خروج رخ دهد.
پلاتفرم زمانی تشخیص میدهد که دستگاهی غیرفعال است که:
- دستگاه ثابت است (بااستفاده از SMD).
- صفحهنمایش دستگاه برای مدتی خاموش است.
وقتی دستگاه باتریدار به شارژر برق وصل باشد، حالت «خواب» فعال نمیشود.
درطول «حالت خواب»
پلاتفرم تلاش میکند سیستم را در حالت خواب نگه دارد، بهطور دورهای عملیات عادی را درطول پنجره نگهداری ازسر میگیرد و سپس دستگاه را برای دورههای تکراری طولانیتر به حالت خواب برمیگرداند. درطول خواب، محدودیتهای زیر فعال است:
- برنامهها اجازه دسترسی به شبکه را ندارند.
- قفلهای بیداری برنامه نادیده گرفته شد.
- هشدارها بهتعویق افتادند. زنگهای ساعت و زنگهای تنظیمشده بااستفاده از
setAndAllowWhileIdle()(محدود به ۱ زنگ در هر ۱۵ دقیقه برای هر برنامه در حالت «آمادهبهکار») را شامل نمیشود. این معافیت برای برنامههایی (مثل «تقویم») درنظر گرفته شده است که باید اعلانهای یادآور رویداد را نشان دهند. - اسکن Wi-Fi انجام نمیشود.
-
SyncAdapterهمگامسازی وJobSchedulerکار تا پنجره نگهداری بعدی بهتعویق افتاد. - برنامههایی که پیامک و فراپیام دریافت میکنند در فهرست سفید موقتی قرار میگیرند تا بتوانند پردازش خود را تکمیل کنند.
خارج شدن
وقتی پلاتفرم موارد زیر را شناسایی کند، دستگاه را از حالت «چرت زدن» خارج میکند:
- تعامل کاربر با دستگاه
- حرکت دستگاه
- صفحه دستگاه روشن میشود
- زنگ ساعت زنگدار قریبالوقوع
اعلانها باعث نمیشوند دستگاه از حالت «چرت» خارج شود.
Android نسخه ۷.۰ و بالاتر با فعال کردن حالت خواب سبک در زمان خاموش بودن صفحهنمایش، پیشاز اینکه دستگاه در حالت بیکار قرار گیرد، Doze را گسترش میدهد.

شکل ۱. حالتهای «خواب آلودگی» برای دستگاههای غیرثابت و ثابت.
| کنش | چرت | Doze سبک |
|---|---|---|
| رهانداز | صفحه خاموش، با باتری، ثابت | صفحه خاموش، با باتری (جدا از برق) |
| زمانبندی | دورههای متوالی با نگهداری | دورههای N دقیقهای تکراری با پنجرههای نگهداری |
| محدودیتها | دسترسی به شبکه، قفل بیداری، یا اسکن GPS/Wi-Fi وجود ندارد؛ هشدارها و کارها/همگامسازیها بهتعویق افتادند | دسترسی به شبکه وجود ندارد؛ کارها/همگامسازیها بهجز درطول دورههای نگهداری به تعویق میافتند |
| رفتار | فقط پیامهای اعلان لحظهای با اولویت بالا دریافت شد | همه پیامهای همزمان (پیامهای فوری، تماسها، و غیره) دریافت شد؛ پیام اعلان لحظهای با اولویت بالا دسترسی موقت به شبکه را فعال میکند |
| خارج شدن | حرکت، روشن شدن صفحهنمایش، یا زنگ ساعت | صفحهنمایش روشن |
تعامل با «آمادهبهکار برنامه»
- زمان صرفشده در Doze برای «حالت آماده بهکار برنامه» محاسبه نمیشود.
- وقتی دستگاه در حالت «بهخواب رفتن» است، برنامههای غیرفعال مجازند حداقل یکبار در روز عملیات عادی انجام دهند.
یکپارچهسازی حالت «اغما»
وقتی «حالت خواب» فعال باشد، دستگاههایی که از
SENSOR_TYPE_SIGNIFICANT_MOTION
پشتیبانی میکنند، بهینهسازیهای کامل «حالت خواب» (ازجمله بهینهسازیهای سبک) را انجام میدهند؛
دستگاههای بدون SMD فقط بهینهسازیهای سبک «حالت خواب» را انجام میدهند. Android بهطور خودکار بهینهسازیهای مناسب «حالت خواب» را انتخاب میکند و پیکربندی فروشنده لازم نیست.
برای فعال کردن «حالت خواب» برای دستگاه:
- تأیید کنید که دستگاه سرویس پیامرسانی ابری نصب شده باشد.
- در فایل پیکربندی رونهاد دستگاه
overlay/frameworks/base/core/res/res/values/config.xml،config_enableAutoPowerModesرا رویtrueتنظیم کنید: در AOSP، این پارامتر بهطور پیشفرض روی<bool name="config_enableAutoPowerModes">true</bool>
false(Doze غیرفعال) تنظیم شده است.
- تأیید کنید که برنامهها و سرویسهای ازپیشبارگذاریشده:
- از
رهنمودهای بهینهسازی
ذخیره انرژی استفاده کنید. برای جزئیات، آزمایش و بهینهسازی برنامهها را ببینید.
یا
- از «حالت خواب» و «آمادهبهکار برنامه» مستثنا هستند. برای جزئیات، به معاف کردن برنامهها مراجعه کنید.
- از
رهنمودهای بهینهسازی
ذخیره انرژی استفاده کنید. برای جزئیات، آزمایش و بهینهسازی برنامهها را ببینید.
- تأیید کنید که سرویسهای ضروری از «حالت خواب» مستثنا شدهاند.
نکتهها
- درصورت امکان، از FCM برای پیامرسانی پاییندستی استفاده کنید.
- اگر کاربران شما باید اعلان را بلافاصله ببینند، از FCM پیام اولویت بالا استفاده کنید.
- اطلاعات کافی را در بار داده اولیه پیام ارائه دهید (تا از دسترسی غیرضروری بعدی به شبکه جلوگیری شود).
- تنظیم هشدارهای مهم با
setAndAllowWhileIdle()وsetExactAndAllowWhileIdle().
آزمایش و بهینهسازی برنامهها
همه برنامهها (بهویژه برنامههای ازپیش بارگیریشده) را در حالت «بهخواب رفتن» آزمایش کنید. برای جزئیات بیشتر، به آزمایش با «حالت خواب» و «آمادهبهکار برنامه» مراجعه کنید.