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 على حالة الشاشة أو حركة الجهاز.
يصنف النظام التطبيقات إلى أربعة buckets (مستويات): 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). بمجرد أن يصغر المستخدم التطبيق ولا يعود إليه، يبدأ النظام في حساب وقت الخمول وقد يخفض bucket إلى Working Set أو Frequent.
يمكن لاستلام رسالة FCM عالية الأولوية رفع bucket التطبيق مؤقتًا إلى Active. يمنح ذلك التطبيق فرصة لأداء مهمة (معالجة الرسالة، مزامنة البيانات) دون قيود. ولكن بعد اكتمال المعالجة، يعود bucket إلى قيمته الأصلية. توصي Google باستخدام هذه الآلية لتوصيل الإشعارات المهمة، وليس لإبقاء التطبيق على قيد الحياة.
App Standby يستخدم أربعة مستويات (buckets) لتصنيف التطبيقات. كل مستوى يحدد وقت التأخير للمهام الخلفية: كلما كان المستوى أقل، طال التأخير. يقوم النظام بتحريك التطبيق تلقائيًا بين المستويات بناءً على إحصائيات الاستخدام المجمعة خلال الأيام 7–14 الأخيرة.
| Bucket | الوصف | تأخير JobScheduler | الشبكة |
|---|---|---|---|
| Active | التطبيق يستخدم بنشاط | لا تأخير | وصول كامل |
| Working Set | يستخدم بانتظام، ولكن ليس الآن | حتى ساعتين | في نوافذ |
| Frequent | يستخدم بشكل متكرر، ولكن ليس يوميًا | حتى 4 ساعات | في نوافذ |
| Rare | تطبيق نادر الاستخدام | حتى 24 ساعة | في نوافذ |
Active — تطبيق تفاعل معه المستخدم مؤخرًا (قام بتشغيله، تلقى إشعارًا أو استخدم ويجتَ). في هذا bucket لا توجد قيود: يتم تشغيل JobScheduler فورًا، الشبكة متاحة، ويعمل AlarmManager بدقة. يبقى التطبيق في Active حتى يتوقف المستخدم عن التفاعل معه لعدة ساعات.
Working Set — يستخدم التطبيق بانتظام (عدة مرات في الأسبوع). تأخير المهام الخلفية حتى ساعتين. Frequent — يستخدم التطبيق عدة مرات في الشهر. تأخير حتى 4 ساعات. في كلا المستويين، الشبكة متاحة فقط في نوافذ الصيانة، وقد يتأخر AlarmManager. يقوم JobScheduler بتنفيذ المهام في أقرب نافذة.
Rare — أشد المستويات صرامة، يتم تعيينه للتطبيقات التي لم يفتحها المستخدم لأكثر من 30 يومًا. يصل تأخير المهام الخلفية إلى 24 ساعة. الشبكة محجوبة بالكامل خارج نوافذ الصيانة، ويعمل AlarmManager فقط بعلامات setAndAllowWhileIdle() بحد مرة واحدة كل 9 دقائق. تظل إشعارات FCM عالية الأولوية تصل ولكنها لا تستطيع رفع bucket.
App Standby يفرض قيودًا على عدة فئات من العمليات الخلفية. بالخلاف من Doze، تنطبق قيود App Standby بغض النظر عن حالة الشاشة وحالة الشحن. يجب على المطور تصميم التطبيق مع مراعاة هذه القيود، خاصة إذا كان الجمهور المستهدف يستخدم التطبيق بشكل غير منتظم.
JobScheduler — واجهة البرمجة الرئيسية المتأثرة بـ App Standby. اعتمادًا على bucket، يتراوح تأخير تنفيذ المهمة من 2 إلى 24 ساعة. WorkManager، الذي يستخدم JobScheduler داخليًا (على API 23+)، يتعرض أيضًا لهذه التأخيرات. للمهام الحساسة للوقت، استخدم Expedited Work، الذي يبدأ Foreground Service داخليًا ولا يتأثر بالbucket.
لا يمكن للتطبيقات في buckets Working Set، Frequent و Rare إجراء طلبات شبكة عشوائية في أي وقت. يسمح النظام بالوصول إلى الشبكة فقط خلال نوافذ الصيانة، التي تتم مزامنتها مع Doze. لإرسال بيانات حرجة، استخدم FCM عالي الأولوية مع مزامنة لاحقة في نافذة الصيانة.
AlarmManager في App Standby يتبع نفس القواعد المتبعة في Doze: المنبهات الدقيقة (setExact()) تتأخر، و setAndAllowWhileIdle() محدود بمرة واحدة كل 9 دقائق. لبكيت Rare، يمكن أن يصل التأخير إلى 24 ساعة، مما يجعل AlarmManager غير مناسب للجدولة الدقيقة للمهام في التطبيقات نادرة الاستخدام.
يمكن الحصول على استثناء من App Standby بطريقتين: من خلال إعدادات البطارية للمستخدم (القائمة البيضاء اليدوية) أو من خلال Intent النظام ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS. ولكن Google تنظم بصرامة الوصول إلى الاستثناءات — التطبيقات دون سبب صالح تخاطر الرفض على Google Play.
يمكن للمستخدم تعطيل القيود يدويًا لتطبيق محدد من خلال الإعدادات → التطبيقات → [التطبيق] → البطارية → التحسين → لا تحسين. يقوم ذلك بإزالة قيود App Standby و Doze بالكامل للتطبيق المحدد. يمكن للمطور عرض التعليمات أو حوار النظام على المستخدم، ولكنه لا يستطيع إضافة تطبيق بالإجبار إلى الاستثناءات.
Foreground Service مع إشعار يحصل تلقائيًا على استثناء مؤقت من App Standby. أثناء تشغيل الخدمة وعرض إشعار، يتم نقل التطبيق إلى bucket Active بغض النظر عن مستواه الحقيقي. بعد إيقاف الخدمة، يعود bucket إلى قيمته الأصلية. هذه هي أكثر طريقة موثوقة لضمان العمل الخلفي دون طلب استثناءات النظام.
له معنى طلب القائمة البيضاء فقط للتطبيقات ذات الوظائف الخلفية الحرجة: الملاحة في الوقت الحقيقي، مراقبة الصحة، مكالمات 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
# إعادة تعيين جميع buckets إلى Active
$ adb shell dumpsys usagestats clear
# عرض جميع buckets النظام
$ 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. صمّم العمل الخلفي بحيث يتم تنفيذه بشكل صحيح مع التأخيرات المميزة لبكيت Frequent و Rare.
Expedited Work (WorkManager 2.7+) يقوم بتشغيل Foreground Service داخليًا، مما يمنح المهمة تنفيذًا فوريًا بغض النظر عن bucket. هذا هو الخيار الأمثل للمهام التي لا يمكن تأجيلها: إرسال رسالة، مزامنة بعد الدفع، معالجة مكالمة واردة. تتم مهام WorkManager العادية في نوافذ الصيانة وفقًا للbucket.
استخدم رسائل FCM عالية الأولوية لإيقاظ التطبيق من App Standby. عندما يتلقى التطبيق هذه الرسالة، يتم رفع bucket خاصته مؤقتًا إلى Active، مما يسمح له بأداء المهام الضرورية (المزامنة، تحديث البيانات). بعد اكتمال المعالجة، يعود bucket إلى مستواه الأصلي.
لا تحاول التخلص من App Standby باستخدام خدمات خلفية مستمرة أو WakeLock أو رسائل FCM دورية. تكافح Google بنشاط مثل هذه الممارسات — قد يتم وسم التطبيق بأنه مستهلك للطاقة ويتم تقييده بشكل أشد. استخدم WorkManager للمهام الدورية و Foreground Service فقط عندما تكون المهمة مرئية بالفعل للمستخدم.
الأسئلة الشائعة
App Standby هو آلية Android تصنف التطبيقات حسب تكرار الاستخدام وتقيد النشاط الخلفي للتطبيقات نادرة الاستخدام. بالخلاف من Doze، يعمل App Standby على مستوى التطبيق بغض النظر عن حالة الشاشة وحركة الجهاز.
يوجد 4 مستويات: Active (بدون قيود)، Working Set (تأخير حتى ساعتين)، 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. سوف نقدم لك النصح ونقترح أفضل حل.