Doze Mode هي وظيفة توفير الطاقة في Android، أدخلت في الإصدار 6.0 Marshmallow، وتقيد بشكل كبير نشاط التطبيقات في الخلفية عندما يكون الجهاز خامدًا. يقوم النظام بتحويل التطبيقات إلى حالة استهلاك منخفض للطاقة، من خلال تأجيل طلبات الشبكة والمزامنة و JobScheduler، لإطالة عمر البطارية. وفقًا لتحليل Android Developers, 2025، يستطيع Doze Mode زيادة وقت الاستعداد للجهاز بنسبة 2–3 مرات حسب الطراز ونسخة نظام التشغيل.
النقاط الرئيسية
Doze Mode هو آلية مدمجة لتوفير الطاقة في Android، تنشط عندما لا يكون الجهاز متصلاً بشاحن، والشاشة مطفأة، ولم يتفاعل المستخدم مع الجهاز لفترة معينة. الهدف من Doze هو تقليل نشاط التطبيقات في الخلفية لتعظيم عمر البطارية في وضع الاستعداد. يقوم النظام بتأجيل JobScheduler، ومزامنة الحسابات، و AlarmManager، وطلبات الشبكة.
تم تقديم هذا الوضع في Android 6.0 Marshmallow (API 23) وتم تحسينه بشكل كبير في الإصدارات اللاحقة. قدم Android 7.0 Nougat مرحلة ثانية (Light Doze) تنشط عند حركة الجهاز. أضاف Android 8.0 قيودًا إضافية على الخدمات الخلفية التي تعمل بالتزامن مع Doze. في Android 12+، تم دمج Doze مع نظام إدارة البطارية المحدث الذي يحلل سلوك المستخدم.
من المهم فهم أن Doze Mode لا يعطل التطبيقات بالكامل. إنه يضعها في حالة مع مهام مؤجلة، ولكنه لا يقتل العمليات. يستمر Foreground Service مع إشعار في العمل، وتصل إعلامات الدفع عالية الأولوية (FCM high-priority)، وتنطلق المنبهات حسب الجدول. Doze يؤثر فقط على عمليات الخلفية التي لا يراها المستخدم ولا يتوقعها في تلك اللحظة.
Doze Mode ينشط عند تحقق جميع الشروط: إطفاء الشاشة لأكثر من 30 دقيقة (التنشيط الأول)، الجهاز ثابت (باستخدام مقياس التسارع)، وغير متصل بشاحن. إذا التقط المستخدم الهاتف أو وصل شاحنًا، يتم إلغاء تنشيط Doze فورًا. في Android 7+، ينشط Light Doze بعد 5 دقائق فقط من عدم النشاط، حتى عند حركة الجهاز.
Doze Mode يدير النشاط الخلفي من خلال خدمة النظام DeviceIdleController، التي تحلل حالة الحساسات والشاشة والشاحن. عند تحقق جميع شروط التنشيط، يقوم النظام بتحويل التطبيقات إلى وضع الاستعداد، مجمعًا طلباتها في نوافذ صيانة. داخل هذه النوافذ، تتم تنفيذ جميع المهام المؤجلة — استدعاءات الشبكة، المزامنة، AlarmManager — دفعة واحدة.
PowerManager في النظام يتحكم في التطبيقات التي يمكنها الخروج من Doze. تستطيع إعلامات الدفع عالية الأولوية (FCM high-priority) إيقاظ الجهاز لتسليم رسالة. كما أن النظام يتجاهل Doze للتطبيقات التي أضافها المستخدم إلى القائمة البيضاء لتحسين البطارية. جميع التطبيقات الأخرى يجب أن تنتظر نافذة الصيانة التالية.
تزداد مدة نوافذ الصيانة في Deep Doze أسييًا: النافذة الأولى بعد ساعة، الثانية بعد ساعتين، الثالثة بعد 4 ساعات، وهكذا حتى فترة قصوى تبلغ 12 ساعة. هذا يعني أنه كلما كان الجهاز في Doze لفترة أطول، قلما تمكن التطبيقات من تنفيذ مهام الخلفية — وبالتالي يتم توفير البطارية بأقصى شكل ممكن.
في Doze Mode، تتم تعليق جميع طلبات الشبكة حتى افتتاح نافذة صيانة. الاستثناءات الوحيدة هي رسائل FCM عالية الأولوية (مع وسم “high_priority” في الحمولة) وإشارات من AlarmManager بعلامات setAndAllowWhileIdle() أو setExactAndAllowWhileIdle(). لن تتم تنفيذ استدعاءات الشبكة العادية عبر Retrofit، OkHttp أو Volley حتى تفتح نافذة.
Doze Mode يتكون من مرحلتين: Light Doze (نوم خفيف) و Deep Doze (نوم عميق). كل مرحلة تفرض قيودها الخاصة ولها عتبات تنشيط مختلفة. فهم الفرق بين المرحلتين أمر حاسم للمطور الذي يصمم مهام خلفية مقاومة لوضع توفير الطاقة.
Light Doze ينشط بعد 5–30 دقيقة من عدم نشاط الجهاز (إطفاء الشاشة، عدم الحركة). في هذه المرحلة، تتم تعليق طلبات الشبكة والمزامنة، ولكن AlarmManager و JobScheduler يستمران في العمل مع تأخيرات طفيفة. يمكن للتطبيقات الخروج من Light Doze عند استلام إعلام دفع أو عند الاتصال بشاحن. Light Doze لا يتطلب عدم الحركة الكاملة — يمكن أن يكون الجهاز في حركة.
Deep Doze يحدث بعد 60–90 دقيقة من عدم النشاط مع جهاز ثابت (لا يكتشف مقياس التسارع حركة). في Deep Doze، يكون النظام أكثر عدوانية في تأجيل المهام: تفتح نوافذ الصيانة بشكل أقل تكرارًا (مع زيادة أسية في الفاصل)، يعمل AlarmManager فقط بعلامات setAndAllowWhileIdle()، ولا يعمل WakeLock بالطريقة العادية. التطبيقات غير الموجودة في القائمة البيضاء تفتقد تقريبًا كل النشاط الخلفي.
| المعلمة | Light Doze | Deep Doze |
|---|---|---|
| وقت التنشيط | 5–30 دقيقة | 60–90 دقيقة |
| متطلب الحركة | غير مطلوب | ثبات |
| فاصل النوافذ | 10–60 دقيقة | 1–12 ساعة |
| AlarmManager | يعمل مع تأخيرات | فقط withAllowWhileIdle |
| الشبكة في النوافذ | متاحة | متاحة |
Doze Mode يفرض عدة فئات من القيود التي يجب على المطور مراعاتها عند تصميم التطبيق. إهمال هذه القيود يؤدي إلى عدم تنفيذ المهام الخلفية، ويرى المستخدم سلوكًا غير صحيح للتطبيق — تحديثات مفقودة، رسائل غير مرسلة، مزامنة غير مكتملة.
تتم حجب جميع طلبات الشبكة حتى افتتاح نافذة صيانة. يشمل ذلك استدعاءات HTTP، وصلات WebSocket، وتنزيل الملفات. الاستثناء هو رسائل FCM عالية الأولوية، التي تمر عبر قناة منفصلة لخدمات Google Play مستقلة عن Doze. لمزامنة البيانات الحرجة، يوصى باستخدام WorkManager مع سياسة NetworkType.CONNECTED.
AlarmManager في Deep Doze يؤجل جميع المنبهات باستثناء تلك المنشأة بطرقتي setAndAllowWhileIdle() و setExactAndAllowWhileIdle(). ولكن حتى هذه الطرق لها حد — لا يزيد عن تنشيط واحد كل 9 دقائق لكل تطبيق. المنبهات الدقيقة بواسطة setExact() في Deep Doze لا تضمن التنشيط في الوقت المحدد.
WakeLock يتصرف بشكل غير اعتيادي في Doze Mode: لا يحتفظ النظام بقفل الاستيقاظ للتطبيقات خارج القائمة البيضاء. حتى إذا كان التطبيق قد حصل بشكل صحيح على PARTIAL_WAKE_LOCK، عند بدء Deep Doze، قد يقوم النظام بتحريره قسريًا. الطريقة الوحيدة لضمان تنفيذ المهمة في Doze هي استخدام Foreground Service مع إشعار.
القائمة البيضاء لـ Doze هي قائمة التطبيقات التي يسمح لها النظام بالنشاط الخلفي في وضع توفير الطاقة مع قيود دنيا. يمكن للمستخدم إضافة التطبيقات دويًا إلى القائمة من خلال الإعدادات → البطارية → تحسين البطارية. تطبيقات النظام، ومشغلات التطبيقات، وخدمات Google Play موجودة في القائمة البيضاء بشكل افتراضي.
يمكن للمطور طلب الإضافة إلى القائمة البيضاء من خلال حوار نظام باستخدام Intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS. يتطلب ذلك الإذن REQUEST_IGNORE_BATTERY_OPTIMIZATIONS في البيان. ولكن، لا يوصي Google بطلب استثناء دون سبب مشروع — التطبيقات التي تسيء استخدام هذه الإمكانية تخاطر بالرفض عند النشر على Google Play.
بدون القائمة البيضاء، يمكن للتطبيق استخدام FCM عالي الأولوية لإيقاظ الجهاز من Doze. كل رسالة من هذا النوع تمنح التطبيق نافذة قصيرة (10–30 ثانية) لتنفيذ مهمة. للعمليات الأطول، يجب على التطبيق تشغيل Foreground Service، وهو ما يستمر في العمل داخل نوافذ صيانة Doze. كما أن Google توفر آلية إعفاء لأنواع معينة من التطبيقات: الملاحة، الطبية، التراسل.
للتحقق مما إذا كان التطبيق موجودًا في القائمة البيضاء لتحسين البطارية، استخدم الطريقة powerManager.isIgnoringBatteryOptimizations(). إذا كانت الطريقة تعيد false، فالتطبيق يخضع لجميع قيود Doze. إذا كانت تعيد true، فيمكن للتطبيق استخدام Wakelock، AlarmManager والشبكة دون قيود حتى في Deep Doze. ولكن إساءة استخدام هذه الامتيازات ستؤدي إلى تقييمات سيئة من المستخدمين.
اختبار سلوك التطبيق في Doze Mode هو خطوة تطوير إلزامية، لأن Doze قد يعطل وظائف الخلفية. يوفر Android أدوات سطر الأوامر من خلال ADB للانتقال الإجباري للجهاز إلى Light Doze و Deep Doze. يجب إجراء الاختبارات على جهاز فعلي أو محاكي بإصدار Android 6.0+.
للدخول إلى Light Doze، استخدم الأمر adb shell dumpsys deviceidle step light. لـ Deep Doze — adb shell dumpsys deviceidle step deep. الأمر adb shell dumpsys deviceidle force-idle deep ينقل الجهاز فورًا إلى Deep Doze دون انتظار المهلة القياسية. بعد الاختبار، يتم الخروج من Doze بالأمر adb shell dumpsys deviceidle unforce.
# الدخول الإجباري إلى Light Doze
$ adb shell dumpsys deviceidle step light
# الدخول الإجباري إلى Deep Doze
$ adb shell dumpsys deviceidle step deep
# الانتقال الفوري إلى Deep Doze
$ adb shell dumpsys deviceidle force-idle deep
# الخروج من Doze
$ adb shell dumpsys deviceidle unforce
# عرض حالة Doze
$ adb shell dumpsys deviceidle
بعد الانتقال إلى Doze Mode، تحقق مما إذا كانت طلبات الشبكة تعمل (يجب أن تكون مؤجلة)، وهل ينطلق AlarmManager، وهل تصل رسائل FCM، وهل تتم تنفيذ مهام WorkManager بشكل صحيح. WorkManager يستمر في العمل خلال Doze: تتم تنفيذ مهامه في نوافذ الصيانة. ولكن إذا كانت المهمة تتطلب تنفيذًا فوريًا، حدد setExpedited() أو استخدم Foreground Service.
تطوير تطبيق مقاوم لـ Doze Mode يتطلب إعادة النظر في المقاربة للمهام الخلفية. يوصي Google بتصميم التطبيق بحيث يعمل بشكل صحيح تحت أي قيود لـ Doze، دون الاعتماد على التنفيذ الفوري للعمليات الخلفية. المبدأ الأساسي هو استخدام WorkManager لجميع المهام الخلفية التي يمكن تأجيلها.
WorkManager هو API Google الموصى به للمهام الخلفية لأنه يتكيف تلقائيًا مع Doze. يستخدم WorkManager JobScheduler (API 23+) أو AlarmManager + BroadcastReceiver في الإصدارات القديمة. تتم تنفيذ مهام WorkManager في أقرب نافذة صيانة لـ Doze، أو فورًا عند الضرورة من خلال Expedited Work (Foreground Service تحت الغطاء).
إذا كانت المهمة لا يمكن تأجيلها (تشغيل الوسائط، الملاحة، VoIP)، استخدم Foreground Service مع إشعار إلزامي. يحصل Foreground Service على إعفاء من Doze: يمكنه احتفاظ WakeLock وتنفيذ طلبات الشبكة. ولكن حتى Foreground Service يخضع لسياسات نوافذ صيانة Deep Doze لبعض أنواع المهام — على سبيل المثال، dataSync.
لتسليم الرسائل التي تتطلب اهتمامًا فوريًا (مكالمة واردة، إشعار عاجل)، استخدم رسائل FCM عالية الأولوية. تقوم هذه الرسائل بإيقاظ الجهاز من Doze وتمنح التطبيق نافذة قصيرة للمعالجة. لا تستخدم الأولوية العالية للإشعارات العادية — فهذا سيؤدي إلى استنزاف سريع للبطارية وقد يعتبر انتهاكًا لسياسة Google Play.
الأسئلة الشائعة
Doze Mode هو وضع توفير الطاقة في Android 6+ يقيد نشاط التطبيقات في الخلفية عندما لا يكون الجهاز قيد الاستخدام (الشاشة مطفأة، لا حركة). يقوم النظام بتأجيل طلبات الشبكة والمزامنة و JobScheduler، مجمعًا إياها في نوافذ صيانة لتوفير البطارية.
Doze Mode له مرحلتان: Light Doze (نوم خفيف) ينشط بعد 5–30 دقيقة ويسمح لـ AlarmManager بالعمل مع تأخيرات. Deep Doze (نوم عميق) يحدث بعد 60–90 دقيقة من عدم الحركة، ويقيد بشكل عدواني المهام الخلفية بنوافذ صيانة تصل إلى 12 ساعة.
Doze يحجب طلبات الشبكة، ويؤجل AlarmManager (باستثناء setAndAllowWhileIdle)، ويحرر WakeLock قسريًا، ويجمع JobScheduler في نوافذ صيانة. استثناءات: Foreground Service، FCM عالي الأولوية، والتطبيقات في القائمة البيضاء للمستخدم.
اطلب الإذن REQUEST_IGNORE_BATTERY_OPTIMIZATIONS في البيان وأرسل Intent بإجراء ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS. سيظهر النظام حوارًا للمستخدم. الإضافة إلى القائمة البيضاء هي امتياز يوصي Google باستخدامه فقط للتطبيقات الحاسمة.
استخدم أوامر ADB: adb shell dumpsys deviceidle force-idle deep للدخول إلى Deep Doze، adb shell dumpsys deviceidle step light لـ Light Doze، adb shell dumpsys deviceidle unforce للخروج. تحقق من سلوك WorkManager، AlarmManager و FCM في كل وضع.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.