Foreground Service — سرویسی Android است که عملیات طولانیمدت را در دید کاربر با اعلان اجباری در نوار وضعیت انجام میدهد. برخلاف Background Service که سیستم میتواند در کمبود منابع آن را متوقف کند، Foreground Service اولویت بالایی دریافت میکند و حتی در شرایط حافظه محدود به کار خود ادامه میدهد. بر اساس مستندات Android Developers, 2025، Foreground Service تنها راه قابل اعتماد برای انجام وظایف طولانیمدت در دستگاههای دارای Android 12 و بالاتر باقی میماند.
نکات مهم
Foreground Service — مؤلفه Android است که برای انجام عملیاتی طراحی شده که کاربر از آن آگاه است و میبیند. این سرویس یک اعلان دائمی در پنل اعلانها نمایش میدهد که نمیتوان آن را نادیده گرفت — تا زمانی که سرویس فعال است، باقی میماند. این تفاوت اصلی با سرویس پسزمینه است که بدون اطلاع کاربر کار میکند.
سیستم Android Foreground Service را به عنوان فرآیندی حیاتی در نظر میگیرد. در کمبود حافظه RAM، پلتفرم ابتدا Background Service، سپس Activityهای کش شده و فقط در موارد استثنایی — Foreground Service را متوقف میکند. OOM Killer به چنین سرویسی سطح ADJ 2 اختصاص میدهد که عملاً توقف اجباری آن را غیرممکن میکند.
برای راهاندازی Foreground Service، توسعهدهنده موظف است متد startForeground() را ظرف چند ثانیه پس از ایجاد سرویس فراخوانی کند، در غیر این صورت سیستم استثنای ForegroundServiceDidNotStartInTimeException را تولید میکند. این الزام سختگیرانه پلتفرم است که برای جلوگیری از وظایف پسزمینه اعلامنشده معرفی شده است.
مکانیزم Foreground Service در Android 1.0 همراه با اولین SDK معرفی شد، اما اعلان اجباری در Android 9 (API 28) ظاهر شد. تا آن زمان سرویس میتوانست بدون نشانگر قابل مشاهده برای کاربر در foreground کار کند. از 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()، سیستم فرآیند سرویس را به گروه foreground با اولویت بقای بالاتر منتقل میکند. این بدان معناست که Android سعی میکند فرآیند را بدون توجه به بار حافظه عملیاتی فعال نگه دارد. 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 انجام میشود که اعلان را از نوار وضعیت پنهان میکند. بلافاصله پس از حذف اعلان، سیستم ممکن است سرویس را foreground محسوب نکند و اولویت آن را به Background Service کاهش دهد که فرآیند را در برابر توقف آسیبپذیر میکند.
PowerManager نقش مهمی در کار Foreground Service ایفا میکند، زیرا حالتهای صرفهجویی در انرژی Android (Doze, App Standby) میتوانند توانایی آن را در انجام وظایف محدود کنند. حتی در وضعیت foreground، سرویس تابع سیاستهای باتری است — درخواستهای شبکه ممکن است به تأخیر بیفتند و تایمرها با پنجرههای Doze همگامسازی شوند. برای عملیات طولانیمدت مقاوم به تأخیر، توصیه میشود از Foreground Service در ترکیب با WorkManager استفاده شود.
از Android 14 (API 34) به بعد، Google اعلام اجباری نوع Foreground Service را در مانیفست معرفی کرد. هر نوع سناریوی استفاده مجاز را تعیین میکند — سیستم مطابقت بین نوع اعلام شده و رفتار واقعی سرویس را بررسی میکند. در مجموع 9 نوع وجود دارد، اما رایجترین آنها موارد زیر هستند.
نوع dataSync برای همگامسازی دادهها بین دستگاه و سرور، انتقال فایلها و پشتیبانگیری طراحی شده است. نمونهها شامل آپلود عکسها در فضای ابری، همگامسازی پایگاه داده با Firebase یا ارسال لاگها به سرور راه دور است. برای این نوع، ذکر دلیل در مانیفست از طریق ویژگی android:foregroundServiceType="dataSync" الزامی است.
نوع mediaPlayback برای پخش صدا و ویدئو در پسزمینه استفاده میشود — پخشکنندههای موسیقی، کلاینتهای پادکست، پخشکنندههای ویدئو. این تنها نوعی است که میتواند بدون دخالت کاربر برای مدت نامحدود کار کند. کانال اعلان باید اولویت بالایی داشته باشد و عناصر کنترل پخش را نمایش دهد — دکمههای play, pause, next, prev از طریق 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() برای راهاندازی هر سرویسی که قصد انتقال به foreground را دارد، اجباری شد. سیستم همچنین Background Execution Limits را معرفی کرد — تایمر (اکنون 10 دقیقه) که پس از آن Background Service به اجبار متوقف میشود.
Foreground Service، برعکس، محدودیت زمان اجرا ندارد. سرویس میتواند ساعتها یا روزها کار کند — تا زمانی که کاربر آن را صریحاً متوقف کند یا دستگاه را راهاندازی مجدد کند. این Foreground Service را به انتخاب بهینه برای برنامههایی تبدیل میکند که نیاز به کار مداوم در پسزمینه دارند: پخشکنندههای موسیقی، ردیابهای فعالیت، برنامههای تماس VoIP.
| پارامتر | Foreground Service | Background Service |
|---|---|---|
| اعلان | اجباری | نیاز نیست |
| مدت زمان | بدون محدودیت | تا 10 دقیقه (API 26+) |
| اولویت سیستم | بالا (ADJ 2) | پایین (ADJ 8+) |
| راهاندازی API 26+ | startForegroundService() | از پسزمینه ممنوع |
از 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 Notification Timeout را در Android 14 معرفی کرد: اگر سرویس ظرف 10 ثانیه پس از ایجاد startForeground() را فراخوانی نکند، سیستم استثنا تولید میکند. این سختگیری برای مبارزه با برنامههایی است که فراخوانی اعلان را به تأخیر میاندازند یا نادیده میگیرند و عملاً به عنوان Background Service تحت پوشش foreground کار میکنند.
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 محدودیتهایی دارد. اصلیترین آنها — دید برای کاربر است. برنامه نمیتواند بدون اعلان وظایف طولانیمدت را در پسزمینه انجام دهد، که از نظر UX همیشه قابل قبول نیست. علاوه بر این، سیستم میتواند حتی 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 دارد.
اگر سرویس ظرف 10 ثانیه پس از ایجاد (Android 14) startForeground() را فراخوانی نکند، سیستم استثنای ForegroundServiceDidNotStartInTimeException را تولید کرده و سرویس را به اجبار متوقف میکند. برنامه همچنین ANR (Application Not Responding) دریافت میکند اگر عملیات روی thread اصلی انجام شود.
خیر، پنهان کردن اعلان Foreground Service به صورت برنامهنویسی غیرممکن است. از Android 9 (API 28) به بعد، اعلان اجباری است و توسط کاربر قابل نادیده گرفتن نیست. تنها راه حذف آن — توقف سرویس با فراخوانی stopForeground(REMOVE_NOTIFICATION) و stopSelf() است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید