Foreground Service هو خدمة Android تنفذ عمليات طويلة وهي مرئية للمستخدم مع إشعار إلزامي في شريط الحالة. بخلاف Background Service، الذي يمكن للنظام إيقافه عند نقص الموارد، يحصل Foreground Service على أولوية عالية ويستمر في العمل حتى في ظروف الذاكرة المحدودة. وفقًا لوثائق Android Developers, 2025، يظل Foreground Service الطريقة الوحيدة الموثوقة لتنفيذ المهام الطويلة على الأجهزة التي تعمل بنظام Android 12 وأحدث.
النقاط الرئيسية
Foreground Service هو مكون Android مصمم لتنفيذ العمليات التي يعرفها المستخدم ويراها. يعرض إشعارًا دائمًا في لوحة الإشعارات لا يمكن إزالته بالتمرير — يبقى نشطًا طالما تعمل الخدمة. هذا هو الفرق الرئيسي عن خدمة الخلفية، التي تعمل بدون أن يلاحظها المستخدم.
يعتبر نظام Android الخدمة الأمامية كعملية حاسمة الأهمية. عند نقص ذاكرة RAM، تقوم المنصة بإيقاف Background Services أولاً، ثم الأنشطة المخزنة مؤقتًا، وفقط في حالات استثنائية — Foreground Service. يمنح OOM Killer هذه الخدمة مستوى ADJ 2، مما يكاد يلغي إيقافها الإجباري.
لتشغيل خدمة أمامية، يجب على المطور استدعاء الطريقة startForeground() خلال ثوانٍ من بعد إنشاء الخدمة، وإلا سيقوم النظام بإنشاء استثناء ForegroundServiceDidNotStartInTimeException. هذا هو متطلب صارم للمنصة تم تقديمه لمنع المهام غير المعلنة في الخلفية.
تم إدراج آلية Foreground Service في Android 1.0 مع أول SDK، ولكن الإشعار الإلزامي ظهر في Android 9 (API 28). قبل ذلك، كانت الخدمة يمكنها العمل في المقدمة بدون مؤشر مرئي للمستخدم. بدءًا من Android 9، شددت Google المتطلبات: أي تطبيق يستدعي startForeground يجب أن يقدم إشعارًا خلال 5 ثوانٍ بعد بدء الخدمة.
في Android 12 (API 31) تمت إضافة قيود على تشغيل Foreground Service من سياق خلفي — الآن يلزم الإذن FOREGROUND_SERVICE_SPECIAL_USE للعديد من السيناريوهات. قدم Android 14 (API 34) إعلانًا إلزاميًا عن foregroundServiceType في البيان، مما يجعل هندسة الخدمات أكثر شفافية وقابلية للتنبؤ.
تعتمد آلية العمل لـ Foreground Service على ثلاث مراحل رئيسية: إنشاء الخدمة، ربط الإشعار وتنفيذ المهمة. ترث الخدمة من الفئة Service وتغطي الطريقة onStartCommand()، وفيها يتم استدعاء startForeground() مع معرف وكائن Notification.
بعد استدعاء startForeground()، ينقل النظام عملية الخدمة إلى مجموعة المقدمة بأولوية بقاء مرتفعة. ويعني هذا أن Android سيحاول الحفاظ على استمرارية العملية بغض النظر عن حمل ذاكرة RAM. لا يمكن إيقاف Foreground Service بواسطة النظام في الظروف العادية — فقط عن طريق إزالة الإشعار بواسطة المستخدم أو استدعاء صريح لـ stopSelf().
يتم إدارة دورة حياة Foreground Service من خلال الطرق onCreate()، onStartCommand() و onDestroy(). في onStartCommand()، يحدد المطور استراتيجية إعادة التشغيل بعد قتل العملية — الثابت START_STICKY يجبر النظام على إعادة إنشاء الخدمة بعد استعادة الموارد، بينما START_NOT_STICKY يمنع إعادة التشغيل التلقائي.
عند تشغيل Foreground Service، تتم الخطوات بالترتيب: استدعاء startService()، إنشاء كائن Service في onCreate()، معالجة Intent في onStartCommand() واستدعاء startForeground() مع كائن Notification. إذا كانت الخدمة تعمل بالفعل ووصل Intent جديد، يتم استدعاء onStartCommand() فقط — onCreate() يتنفذ مرة واحدة فقط خلال عمر الخدمة.
يتم إيقاف Foreground Service من خلال stopForeground() مع العلامة REMOVE_NOTIFICATION، التي تخفي الإشعار من شريط الحالة. بعد إزالة الإشعار فورًا، قد يتوقف النظام عن اعتبار الخدمة أمامية ويخفض أولويتها إلى Background Service، مما يجعل العملية عرضة للإيقاف.
PowerManager يلعب دورًا مهمًا في عمل Foreground Service، حيث أن أوضاع توفير الطاقة في Android (Doze، App Standby) قد تحد من قدرته على تنفيذ المهام. حتى أثناء التواجد في حالة المقدمة، تخضع الخدمة لسياسات البطارية — قد تتأخر طلبات الشبكة وقد تتزامن المؤقتات مع نوافذ Doze. للعمليات الطويلة التي تتحمل التأخير، يوصى باستخدام Foreground Service بالإضافة إلى WorkManager.
بدءًا من Android 14 (API 34)، قدمت Google إعلانًا إلزاميًا عن نوع Foreground Service في البيان. يحدد كل نوع سيناريو استخدام مسموحًا — يتحقق النظام من التوافق بين النوع المعلن والسلوك الفعلي للخدمة. يوجد 9 أنواع إجمالًا، ولكن الأكثر استخدامًا هي التالية.
نوع dataSync مصمم لمزامنة البيانات بين الجهاز والخادم، ونقل الملفات والنسخ الاحتياطية. تشمل الأمثلة رفع الصور إلى تخزين سحابي، مزامنة قاعدة البيانات مع Firebase أو تحميل السجلات إلى خادم بعيد. يتطلب هذا النوع تحديد المبرر في البيان من خلال السمة android:foregroundServiceType="dataSync".
يستخدم نوع mediaPlayback لتشغيل الصوت والفيديو في الخلفية — مشغلات الموسيقى، عملاء البودكاست، مشغلات الفيديو. هذا هو النوع الوحيد الذي يمكنه العمل لمدة غير محدودة بدون تدخل المستخدم. يجب أن يكون لقناة الإشعارات أولوية عالية وتعرض عناصر تحكم بالتشغيل — أزرار التشغيل، الإيقاف المؤقت، التالي، السابق من خلال MediaStyle.
نوع location مخصص لخدمات التحديد الجغرافي — تطبيقات الملاحة، تتبع النشاط، السياج الجغرافي. لـ Android 14+ يجب الإعلان عن الإذن FOREGROUND_SERVICE_LOCATION وتحديد النوع في البيان. يجب أن يكون للتطبيق إذن موقع نشط في وقت التشغيل، وإلا سيرفض النظام تشغيل الخدمة.
| النوع | الإذن | مثال استخدام |
|---|---|---|
| dataSync | FOREGROUND_SERVICE_DATA_SYNC | مزامنة الملفات مع السحابة |
| mediaPlayback | FOREGROUND_SERVICE_MEDIA_PLAYBACK | مشغل موسيقى في الخلفية |
| location | FOREGROUND_SERVICE_LOCATION | ملاح GPS أثناء القيادة |
| camera | FOREGROUND_SERVICE_CAMERA | تطبيق مراقبة فيديو |
| connectedDevice | FOREGROUND_SERVICE_CONNECTED_DEVICE | العمل مع جهاز BLE |
الفرق الرئيسي بين Foreground و Background Service هو وجود إشعار مرئي وأولوية البقاء. يمكن إيقاف Background Service بواسطة النظام في أي وقت عند نقص الذاكرة، بينما يستمر Foreground Service في العمل بفضل ارتفاع مستوى adj للعملية في آلية Low Memory Killer في Android.
لا يتطلب Background Service إشعارًا ويمكنه العمل بدون أن يلاحظه المستخدم. ولكن بدءًا من Android 8 (API 26)، قيدت Google بشكل كبير الخدمات الخلفية: startService() من سياق خلفي لم يعد يعمل، وأصبح Context.startForegroundService() إلزاميًا لتشغيل أي خدمة تخطط للانتقال إلى المقدمة. قدم النظام أيضًا حدود تنفيذ الخلفية — مؤقتاً (حاليًا 10 دقائق) بعدها يتم إيقاف Background Service إجباريًا.
Foreground Service، على النقيض من ذلك، ليس له حد زمني. يمكن للخدمة العمل لساعات أو أيام — حتى يوقفها المستخدم صراحة أو يعيد تشغيل الجهاز. وهذا يجعل Foreground Service الخيار الأمثل للتطبيقات التي تتطلب عملًا متواصلًا في الخلفية: مشغلات الموسيقى، متتبعات النشاط، تطبيقات مكالمات VoIP.
| المعلمة | Foreground Service | Background Service |
|---|---|---|
| الإشعار | إلزامي | غير مطلوب |
| مدة الحياة | بدون حد | حتى 10 دقائق (API 26+) |
| أولوية النظام | عالية (ADJ 2) | منخفضة (ADJ 8+) |
| تشغيل API 26+ | startForegroundService() | ممنوع من background |
بدءًا من Android 12 (API 31)، فرضت Google قيودًا كبيرة على تشغيل Foreground Service. التغيير الرئيسي هو حظر استدعاء startForegroundService() من سياق خلفي لمعظم أنواع الخدمات. تنطبق الاستثناءات فقط عندما وافق المستخدم صراحة (على سبيل المثال، من خلال الإذن FOREGROUND_SERVICE_SPECIAL_USE) أو عندما تتم تشغيل الخدمة استجابة لنية البث العام BOOT_COMPLETED.
يجب أن يحتوي بيان التطبيق المستهدف API 34+ على كتلة foregroundServiceType لكل خدمة معلنة. على سبيل المثال، لخدمة مزامنة البيانات، يتم تحديد android:foregroundServiceType="dataSync". إذا لم يتم تحديد النوع، يعتبر النظام الخدمة غير صالحة ويطرح استثناء MissingForegroundServiceTypeException عند محاولة التشغيل. كما أن Google Play تتحقق أيضًا من امتثال الأنواع وقد ترفض النشر في حال عدم التطابق.
في Android 14 (API 34)، كل نوع من Foreground Service يتطلب إذنًا منفصلًا. يجب على المطور الإعلان عنها في البيان وطلبها في وقت التشغيل قبل بدء الخدمة. لـ dataSync يلزم FOREGROUND_SERVICE_DATA_SYNC، ولـ mediaPlayback — FOREGROUND_SERVICE_MEDIA_PLAYBACK. يمكن للمستخدم إلغاء الإذن في الإعدادات، مما يؤدي إلى إيقاف الخدمة النشطة.
قدمت Google أيضًا آلية مهلة إشعار Foreground Service في Android 14: إذا لم تستدع الخدمة startForeground() خلال 10 ثوانٍ من الإنشاء، يطرح النظام استثناءً. هذه التشديدات موجهة لمكافحة التطبيقات التي تؤخر أو تتجاوز استدعاء الإشعار، تعمل بفعلية كخدمة خلفية مقنعة بأنها أمامية.
يتم استخدام Foreground Service في مجموعة واسعة من المهام التي تتطلب تنفيذًا مضمونًا في الخلفية. تشمل السيناريوهات الأكثر شيوعًا تشغيل الوسائط، تتبع الموقع الجغرافي، مزامنة البيانات والعمل مع الأجهزة الطرفية. دعنا ننظر إلى كل منها بالتفصيل.
المثال الكلاسيكي هو مشغل موسيقى يستمر في التشغيل بعد تصغير التطبيق. تبدأ الخدمة بإشعار MediaStyle وأزرار التحكم وتستخدم نوع mediaPlayback. يرى المستخدم معلومات المسار في شريط الحالة ويمكنه التحكم في التشغيل بدون فتح التطبيق.
تطبيقات الملاحة تستخدم Foreground Service من نوع location لتتبع الإحداثيات بشكل مستمر. تعرض الخدمة إشعارًا يظهر السرعة الحالية ووقت السفر وزر إيقاف التتبع. بدون Foreground Service، سيتوقف النظام عن استقبال الإحداثيات في الخلفية بعد بضع دقائق، مما يجعل الملاحة مستحيلة.
تطبيقات المكالمات الصوتية والمرئية — عملاء VoIP — تستخدم Foreground Service للحفاظ على اتصال نشط. يضمن الخدمة من نوع phoneCall (منذ Android 14) عدم انقطاع المكالمة عند تصغير التطبيق. يعرض الإشعار مدة المكالمة وعناصر التحكم في الميكروفون ومكبر الصوت.
دعنا ننظر إلى إنشاء Foreground Service باستخدام Kotlin لمزامنة البيانات. ستبدأ الخدمة من Activity، تعرض إشعارًا مع تقدم، وتنتهي بشكل صحيح بعد الانتهاء. يوضح المثال جميع العناصر الإلزامية: الإعلان في البيان، قناة الإشعارات، استدعاء startForeground() ومعالجة foregroundServiceType.
class SyncService : Service() {
companion object {
const val CHANNEL_ID = "sync_channel"
const val NOTIFICATION_ID = 1001
}
override fun onCreate() {
super.onCreate()
createNotificationChannel()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = buildNotification()
startForeground(NOTIFICATION_ID, notification)
performSync()
return START_STICKY
}
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID,
"مزامنة",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "قناة مزامنة البيانات"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
private fun buildNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("مزامنة")
.setContentText("تحميل البيانات إلى الخادم")
.setSmallIcon(R.drawable.ic_sync)
.setOngoing(true)
.build()
}
private fun performSync() {
GlobalScope.launch(Dispatchers.IO) {
// محاكاة المزامنة
delay(5000)
stopForeground(Service.STOP_FOREGROUND_REMOVE)
stopSelf()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
لتشغيل الخدمة بشكل صحيح على Android 12+، يجب الإعلان عن Foreground Service في AndroidManifest.xml مع تحديد النوع والأذون المطلوبة. السمة foregroundServiceType إلزامية للأنظمة المستهدفة API 34+، ويجب طلب الأذون FOREGROUND_SERVICE_DATA_SYNC و POST_NOTIFICATIONS في وقت التشغيل.
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission
android:name="android.permission.POST_NOTIFICATIONS" />
<application ...>
<service
android:name=".SyncService"
android:foregroundServiceType="dataSync"
android:exported="false" />
</application>
على الرغم من موثوقيته العالية، لدى Foreground Service قيود. الرئيسي منها هو الظهور للمستخدم. لا يمكن للتطبيق تنفيذ مهام طويلة في الخلفية بدون إشعار، وهذا ليس مقبولًا دائمًا من وجهة نظر تجربة المستخدم. بالإضافة، قد يوقف النظام إجباريًا حتى Foreground Service عند تجاوز الحد الزمني لبعض الأنواع — على سبيل المثال، dataSync محدود بعدة ساعات من العمل.
بديل Foreground Service هو WorkManager، مكتبة Android Jetpack للمهام المؤجلة والخلفية. يضمن WorkManager تنفيذ المهمة حتى بعد إعادة تشغيل الجهاز ويدعم سلاسل المهام والعمليات الدورية وقيود الشبكة والبطارية. لمعظم عمليات الخلفية، توصي Google باستخدام WorkManager بدلاً من خدمة مباشرة.
JobScheduler هو API مضمن في Android لجدولة المهام. يناسب العمليات التي يمكن تأجيلها: المزامنة عبر Wi-Fi، تنزيل البيانات عند الاتصال بالشاحن. يجمع JobScheduler المهام في نوافذ لتوفير البطارية، بخلاف Foreground Service الذي يعمل بشكل متواصل بغض النظر عن حالة توفير الطاقة.
للمهام القصيرة (حتى 10–15 ثانية)، يمكن استخدام CoroutineWorker من WorkManager مع تأخير التنفيذ. إذا كانت المهمة يجب تنفيذها بشكل صارم في وقت محدد، يتم استخدام AlarmManager مع BroadcastReceiver. وبالتالي، Foreground Service هو حل للعمليات المتواصلة الطويلة، وليس أداة عامة لجميع سيناريوهات الخلفية.
الأسئلة الشائعة
Foreground Service هو خدمة Android مع إشعار دائم في شريط الحالة تنفذ مهام طويلة مرئية للمستخدم. لديها أولوية بقاء عالية ولا يوقفها النظام عند نقص الذاكرة، بخلاف Background Service.
Foreground Service يعرض إشعارًا إلزاميًا، ليس له حد زمني ومحمي من إيقاف النظام. Background Service غير مرئي للمستخدم، يعمل لمدة تصل إلى 10 دقائق (API 26+) ويمكن إيقافه بواسطة Low Memory Killer في أي وقت.
Android 14 يحدد 9 أنواع: dataSync، mediaPlayback، location، camera، connectedDevice، phoneCall، microphone، health و remoteMessaging. يتطلب كل نوع إذنًا مناسبًا وتحديده في البيان من خلال السمة foregroundServiceType.
إذا لم تستدع الخدمة startForeground() خلال 10 ثوانٍ من الإنشاء (Android 14)، يطرح النظام استثناء ForegroundServiceDidNotStartInTimeException ويوقف الخدمة إجباريًا. كما أن التطبيق سيتلقى ANR (التطبيق لا يستجيب) إذا كانت العملية تتنفذ على الخيط الرئيسي.
لا، إخفاء إشعار Foreground Service برمجيًا غير ممكن. بدءًا من Android 9 (API 28)، الإشعار إلزامي ولا يمكن للمستخدم إزالته بالتمرير. الطريقة الوحيدة لإزالته هي إيقاف الخدمة باستدعاء stopForeground(REMOVE_NOTIFICATION) و stopSelf().
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.