WakeLock هي آلية في Android تمنع الجهاز من الدخول في وضع السكون عن طريق إبقاء المعالج أو الشاشة نشطة. المهام في الخلفية، مثل تنزيل الملفات أو تشغيل الصوت أو تسجيل البيانات، تتطلب WakeLock لضمان التنفيذ دون انقطاع. وفقاً لمواصفات Android Developers, 2025، الاستخدام غير الصحيح لـ WakeLock يؤدي إلى استنزاف سريع للبطارية وقد يتسبب في حظر التطبيق في Google Play.
الخلاصة
WakeLock هو قفل نظام يمنع Android من وضع الجهاز في وضع استهلاك الطاقة المنخفض. عادةً، بعد بضع ثوانٍ من عدم نشاط المستخدم، يقوم Android بإيقاف تشغيل الشاشة ووضع المعالج في حالة السكون العميق (deep sleep)، مما يعلق سلاسل المهام في الخلفية. يمنع WakeLock هذا الانتقال عن طريق إبقاء المعالج نشطاً.
يتم إدارة آلية WakeLock من خلال خدمة النظام PowerManager، التي يتم الوصول إليها عبر الطريقة getSystemService(Context.POWER_SERVICE). يقوم المطور بإنشاء كائن WakeLock، مع تحديد نوع القفل، ويجب أن يحرره بشكل مضمون بعد اكتمال المهمة، وإلا فسيتم استنزاف بطارية الجهاز بسرعة. النظام لا يحرر WakeLock تلقائياً — هذه مسؤولية التطبيق.
مع كل إصدار رئيسي من Android، تشدد Google السيطرة على WakeLock. بدءاً من Android 9 (API 28)، لا يمكن للتطبيق في الخلفية الحصول على WakeLock بدون سبب وجيه، ويقوم النظام بتتبع التطبيقات التي تسيء استخدام الأقفال وقد يحررها قسراً. في Android 12+، تم إدخال قيود إضافية على الوصول إلى PowerManager للتطبيقات في الخلفية.
WakeLock مطلوب في السيناريوهات التي لا يمكن فيها مقاطعة المهمة بسبب دخول الجهاز في وضع السكون: تنزيل ملف كبير عبر اتصال غير مستقر، تسجيل فيديو، إجراء عمليات حسابية طويلة دون تفاعل المستخدم. بدون قفل السكون، يدخل المعالج في سكون عميق، ويتم تجميد جميع سلاسل المهام، وتبقى المهمة غير مكتملة.
ومع ذلك، توصي Google بشدة بتقليل استخدام WakeLock. في معظم الحالات، يمكن حل نفس المهمة باستخدام Foreground Service مع إشعار، أو WorkManager، أو JobScheduler. هذه الآليات تراعي حالة البطارية والشبكة، مما يطيل عمر البطارية للجهاز.
WakeLock يعمل من خلال خدمة النظام PowerManager، التي تدير حالة طاقة الجهاز. عندما يطلب التطبيق قفلاً عبر powerManager.newWakeLock()، يقوم النظام برفع مستوى نشاط المعالج، مما يمنع السكون العميق. بعد استدعاء wakeLock.release()، يعود النظام إلى وضع توفير الطاقة العادي.
من المهم فهم أن WakeLock لا يمنع جميع أوضاع توفير الطاقة. Doze Mode (وضع السكون من Android 6+) قد يتجاهل WakeLock في مراحل معينة — التطبيق الذي يحتفظ بـ WakeLock لن يحصل على وصول للشبكة خلال نوافذ الصيانة في Doze. هذا يعني أنه حتى WakeLock النشط لا يضمن عمليات الشبكة خلال المرحلة الثانية من Doze.
كل WakeLock مرتبط بـ PowerManager.WakeLock على جانب الإطار. يقوم النظام بحساب الأقفال النشطة على مستوى العملية: إذا كانت عملية واحدة تحتفظ بعدة WakeLock، فإنها تتراكم، ولا يتم التحرير إلا بعد استدعاء release() لكل قفل. كما يدعم Android مهلات قفل الاستيقاظ (wake lock timeouts) — التحرير التلقائي بعد فترة محددة. ومع ذلك، لا يُنصح بالاعتماد على المهلة: قد تكتمل المهمة مبكراً، ووقت الاحتفاظ الإضافي سيقلل من عمر البطارية.
عند دخول الجهاز في وضع السكون (زر الطاقة)، يقوم Android بتحرير جميع SCREEN_DIM_WAKE_LOCK و SCREEN_BRIGHT_WAKE_LOCK قسراً، لكنه يحتفظ بـ PARTIAL_WAKE_LOCK. هذا يعني أن قفل الشاشة لا يمكنه إبقاء الشاشة مضاءة — فقط PARTIAL_WAKE_LOCK يمكنه مواصلة العمل بعد الضغط على زر الطاقة.
يوجد في Android عدة أنواع من WakeLock، كل منها يتحكم في مكونات محددة للجهاز. اختيار النوع يحدد أي مكونات الأجهزة تبقى نشطة بعد القفل. اختيار النوع الخاطئ يؤدي إلى استهلاك مفرط للطاقة بسبب إبقاء وحدات غير ضرورية قيد التشغيل.
| النوع | المعالج | الشاشة | لوحة المفاتيح | متى يُستخدم |
|---|---|---|---|---|
| PARTIAL_WAKE_LOCK | تشغيل | إيقاف | إيقاف | تنزيل الملفات، العمليات الحسابية |
| SCREEN_DIM_WAKE_LOCK | تشغيل | خافت | إيقاف | مشغل الفيديو، عرض تقديمي |
| SCREEN_BRIGHT_WAKE_LOCK | تشغيل | ساطع | إيقاف | الألعاب (قديم) |
| FULL_WAKE_LOCK | تشغيل | ساطع | ساطع | قديم (مهمل) |
PARTIAL_WAKE_LOCK هو النوع الأكثر استخداماً والموصى به. يبقي المعالج نشطاً ولكنه يسمح بإطفاء الشاشة وإضاءة لوحة المفاتيح. هذا هو الخيار الأمثل للمهام في الخلفية: تحميل البيانات، معالجة الصور، المزامنة. تنطفئ الشاشة بعد مهلة النظام، مما يوفر البطارية أثناء أداء عمل غير مرئي للمستخدم.
SCREEN_DIM_WAKE_LOCK و SCREEN_BRIGHT_WAKE_LOCK و FULL_WAKE_LOCK تم إهمالها منذ Android 7 (API 24). إنها تبقي الشاشة مضاءة، مما يؤدي إلى استهلاك كبير للبطارية. توصي Google باستخدام FLAG_KEEP_SCREEN_ON عبر Activity.getWindow().addFlags() بدلاً من ذلك — هذه العلامة تعمل فقط عندما تكون Activity نشطة ولا تتطلب إذن WAKE_LOCK، بينما يدير النظام تلقائياً وقت الاحتفاظ بالشاشة.
WakeLock هو أحد أهم مستنزفي البطارية في Android. كل ثانية من الاحتفاظ بقفل السكون تستهلك طاقة إضافية لأن المعالج لا يمكنه الانتقال إلى حالة C الموفرة للطاقة. يُظهر بحث Google Power Dashboard أن التطبيقات التي تحتوي على WakeLock محررة بشكل غير صحيح يمكن أن تزيد استهلاك طاقة الجهاز بنسبة 30–50% في وضع الاستعداد.
يقوم النظام بتتبع التطبيقات التي تسيء استخدام WakeLock من خلال مكون Battery Historian. يمكن للمطور تحليل ملف استهلاك الطاقة وتحديد تسريبات الأقفال — المواقف التي تم فيها إنشاء WakeLock ولكن لم يتم تحريرها. تعرض Google Play Console إحصائيات WakeLock للتطبيقات المنشورة، وقد يؤدي وقت الاحتفاظ المرتفع إلى تقييمات سيئة.
Doze Mode و App Standby يقيدان عمل WakeLock بشكل إضافي. في المرحلة الأولى من Doze (Light Doze)، يسمح النظام بـ WakeLock في نوافذ صيانة قصيرة. في المرحلة الثانية (Deep Doze)، يتم دمج WakeLock مع أقفال أخرى وتنفيذه في نافذة مشتركة. إذا احتفظ التطبيق بـ WakeLock لأكثر من 10 دقائق دون تفاعل المستخدم، يجوز للنظام تحريره قسراً وإضافة التطبيق إلى القائمة السوداء لتحسين البطارية.
الاستخدام الصحيح لـ WakeLock هو توازن بين ضرورة إكمال المهمة والحفاظ على بطارية الجهاز. توصي Google باتباع عدة مبادئ: تحرير WakeLock دائماً في كتلة finally أو عبر acquire(timeout)، واستخدام أقل نوع قفل ضروري، وتجنب الاحتفاظ الطويل دون حاجة ماسة.
يجب تحرير WakeLock في نفس كتلة الكود التي تم إنشاؤه فيها. لضمان التحرير في حالات الاستثناءات، يتم استخدام بناء try-finally أو كتلة use في Kotlin. على Android 10+، يعرض النظام تحذيراً في logcat إذا تم الاحتفاظ بـ WakeLock لأكثر من 60 ثانية: "WakeLock held for more than 60 seconds" — هذه إشارة إلى تسرب محتمل.
طريقة acquire(long timeout) تحرر WakeLock تلقائياً بعد الوقت المحدد بالميلي ثانية. هذا تأمين في حال عدم تنفيذ كود التحرير بسبب استثناء أو خطأ. يُوصى دائماً بتحديد مهلة تساوي أقصى وقت متوقع لتنفيذ المهمة بالإضافة إلى هامش 10–20%.
قبل استدعاء release()، يجب التحقق مما إذا كان WakeLock محتفظاً به حالياً. استدعاء release() مرة أخرى دون acquire() سابق يسبب RuntimeException: WakeLock under-locked. يُوصى بتخزين علامة حالة (isHeld) والتحقق من wakeLock.isHeld() قبل التحرير.
لنلقِ نظرة على الإنشاء والتحرير الصحيحين لـ WakeLock في Kotlin. يوضح المثال تحميل البيانات غير المتزامن مع الاحتفاظ بـ PARTIAL_WAKE_LOCK، والتحرير المضمون في كتلة try-finally، ومهلة محددة كتأمين ضد التسريبات. تستخدم الخدمة CoroutineScope مع موزع IO لتنفيذ المهمة في الخلفية.
class DownloadService : Service() {
private lateinit var wakeLock: PowerManager.WakeLock
private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
override fun onCreate() {
super.onCreate()
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
wakeLock = powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK,
"download:wakelock"
)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
wakeLock.acquire(60000)
scope.launch {
try {
downloadFile()
} finally {
if (wakeLock.isHeld()) {
wakeLock.release()
}
}
}
return START_NOT_STICKY
}
private suspend fun downloadFile() {
// محاكاة تنزيل ملف
delay(30000)
}
override fun onDestroy() {
super.onDestroy()
scope.cancel()
if (wakeLock.isHeld()) {
wakeLock.release()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
لاستخدام WakeLock، يجب إضافة الإذن في AndroidManifest.xml. إذن WAKE_LOCK هو إذن عادي — لا يتطلب طلباً في وقت التشغيل من المستخدم ويُمنح تلقائياً عند تثبيت التطبيق. ومع ذلك، قد يرفض Google Play النشر إذا لم يكن للتطبيق حالة استخدام واضحة لـ WakeLock.
<uses-permission
android:name="android.permission.WAKE_LOCK" />
<uses-permission
android:name="android.permission.DEVICE_POWER" />
WakeLock هي آلية منخفضة المستوى، وتوصي Google باستبدالها بواجهات برمجة تطبيقات أكثر حداثة كلما أمكن. البديل الرئيسي هو Foreground Service مع إشعار، الذي يحتفظ تلقائياً بقفل المعالج طوال مدة الخدمة. النظام نفسه يدير WakeLock لـ Foreground Service، مما يعفي المطور من الاستحواذ والتحرير الصريحين.
WorkManager هو ثاني أهم أداة للمهام في الخلفية. يضمن تنفيذ المهمة حتى عند دخول الجهاز في وضع Doze وبعد إعادة التشغيل. يدعم WorkManager قفلاً داخلياً (hold lock) — لا يحتاج المطور إلى العمل مع PowerManager بشكل صريح. يتم تنفيذ المهمة في نافذة صيانة Doze مع إدارة تلقائية لقفل السكون.
للمهام الدورية التي تتطلب توقيتاً دقيقاً، يتم استخدام AlarmManager مع setAndAllowWhileIdle()، والذي يمكنه إيقاظ الجهاز من Doze. ومع ذلك، فإن AlarmManager مناسب فقط للعمليات القصيرة — فهو غير مصمم للاحتفاظ بـ WakeLock لفترة طويلة. إذا استغرقت المهمة أكثر من 10 ثوانٍ، يجب دمج AlarmManager مع BroadcastReceiver يقوم بتشغيل Foreground Service.
الأسئلة الشائعة
WakeLock هو قفل نظام يمنع جهاز Android من الدخول في وضع السكون. يبقي المعالج أو الشاشة نشطة، مما يسمح للمهام في الخلفية (التنزيلات، العمليات الحسابية) بالتنفيذ دون انقطاع. يتم إدارته من خلال خدمة النظام PowerManager.
الأنواع الرئيسية: PARTIAL_WAKE_LOCK (المعالج نشط، الشاشة مطفأة) — موصى به؛ SCREEN_DIM_WAKE_LOCK (المعالج + شاشة خافتة)؛ SCREEN_BRIGHT_WAKE_LOCK (المعالج + شاشة ساطعة). SCREEN_DIM و SCREEN_BRIGHT و FULL_WAKE_LOCK مهملة وتم استبدالها بـ FLAG_KEEP_SCREEN_ON.
نعم، يجب الإعلان عن android.permission.WAKE_LOCK في البيان. هذا إذن عادي يُمنح تلقائياً عند التثبيت — لا حاجة لطلبه في وقت التشغيل. بدون هذا الإذن، سيعيد استدعاء newWakeLock() القيمة null أو سيؤدي إلى استثناء SecurityException.
إذا لم يتم استدعاء release()، لا يمكن للجهاز الدخول في وضع السكون. البطارية ستنزف بشكل أسرع بكثير (حتى 50% استهلاك إضافي). سيسجل النظام التسريب في logcat، وسيُظهر Battery Historian وقت احتفاظ غير طبيعي بـ WakeLock، مما يؤدي إلى تقييمات مستخدمين سيئة.
للمهام الطويلة، استخدم Foreground Service مع إشعار — النظام يدير WakeLock بنفسه. للمهام المؤجلة والمضمونة، استخدم WorkManager، الذي يدعم WakeLock داخلياً. للمهام القصيرة المجدولة، استخدم AlarmManager.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.