Background Execution — مکانیزم اجرای کد برنامه موبایل در زمانی که در پیشزمینه نیست. بدون این مکانیزم، برنامه هنگام کوچکسازی توسط سیستم متوقف میشود. به گفته Apple, 2026، iOS زمان پسزمینه را به ۳۰ ثانیه محدود میکند، در حالی که Android سناریوهای انعطافپذیرتری از طریق WorkManager و Foreground Service ارائه میدهد.
نکات اصلی
Background Execution — توانایی برنامه برای ادامه اجرای کد پس از آنکه کاربر آن را کوچک کرد یا به برنامه دیگری سوئیچ کرد. بدون مکانیزمهای خاص، سیستمعامل موبایل برنامه را پس از چند ثانیه به حالت Suspended (معلق) میبرد و پردازنده و حافظه را برای برنامههای فعال آزاد میکند.
برنامه موبایل چندین وضعیت چرخه حیات را طی میکند: Foreground (فعال)، Background (پسزمینه)، Suspended (معلق) و Terminated (پایانیافته). Background — تنها وضعیتی است که برنامه میتواند بدون رابط کاربری قابل مشاهده کد اجرا کند. iOS و Android مدت زمان و عملیات مجاز را در این وضعیت متفاوت تعریف میکنند.
اجرای پسزمینه برای وظایف همگامسازی دادهها، دانلود محتوا، پردازش اعلانهای Push، مکانیابی در پسزمینه و پخش صدا ضروری است. همگامسازی — رایجترین سناریو: برنامه بدون دخالت کاربر دادهها را به سرور ارسال میکند یا بهروزرسانیها را دانلود میکند.
محدودیتهای اجرای پسزمینه ناشی از سه عامل است: مصرف انرژی، عملکرد دستگاه و حریم خصوصی کاربر. پردازنده و ماژولهای رادیویی (Wi-Fi، دادههای تلفن همراه) بیشترین انرژی را مصرف میکنند — هر فرآیند پسزمینه عمر باتری را کاهش میدهد.
تحقیقات Google نشان میدهد که برنامههایی که هر ۵ دقیقه وظایف پسزمینه را اجرا میکنند، عمر باتری دستگاه را ۲۰–۳۰٪ در روز کاهش میدهند. حتی عملیاتهای بهینهشده پسزمینه با تناوب یک بار در ساعت، اگر بیش از دو برنامه از این دست باشد، تأثیر قابل توجهی دارند.
هر برنامه پسزمینه حافظه رم را اشغال میکند. در کمبود حافظه، سیستم برنامهها را از حافظه خارج میکند که منجر به راهاندازی مجدد هنگام بازگشت کاربر میشود. iOS از الگوریتم Jetsam استفاده میکند — مکانیزم خاتمه اجباری فرآیندهای پسزمینه هنگام تجاوز از محدودیت حافظه. Android از LMK (Low Memory Killer) با اصل مشابه استفاده میکند.
از Android 10 و iOS 13، سیستم از برنامهها میخواهد هدف کار پسزمینه را اعلام کنند. Android راهاندازی Broadcast Receiver در پسزمینه را محدود کرد. iOS نیاز به مشخص کردن Background Mode در Capabilities پروژه دارد. کاربر میتواند اجرای پسزمینه را برای هر برنامه در تنظیمات غیرفعال کند.
| سیستمعامل | نسخه | محدودیت | تأثیر |
|---|---|---|---|
| Android | ۸.۰ | IMPLICIT_BROADCAST ممنوع | ۶۷٪ Broadcastهای پسزمینه شکستند |
| Android | ۹.۰ | Doze بهبود یافت | محدودیت فراخوانیهای شبکه |
| Android | ۱۲+ | Foreground Service محدود شد | ممنوعیت راهاندازی از پسزمینه |
| iOS | ۷+ | Background App Refresh | پنجرههای بهروزرسانی دورهای |
| iOS | ۱۳+ | BGTaskScheduler | برنامهریزی به جای اجرا |
Android چندین مکانیزم برای اجرای پسزمینه ارائه میدهد که هر کدام دسته خاصی از وظایف را حل میکنند. WorkManager — API توصیهشده برای وظایف تأخیری و دورهای. Foreground Service — برای اجرای فوری با اعلان قابل مشاهده. JobScheduler — آنالوگ سطح پایین WorkManager.
WorkManager — بخشی از Android Jetpack است که اجرای وظایف پسزمینه را با ضمانت اتمام حتی پس از راهاندازی مجدد دستگاه تضمین میکند. API زمان بهینه اجرا را با در نظر گرفتن وضعیت شبکه، سطح باتری و حالت Doze انتخاب میکند. WorkManager با API 14+ سازگار است و جایگزین AlarmManager و JobScheduler قدیمی میشود.
زمانی که برنامه نیاز به اجرای وظیفه قابل مشاهده برای کاربر دارد (پخش موسیقی، ثبت مکان)، از Foreground Service استفاده میشود. سرویس یک اعلان دائمی در نوار وضعیت نشان میدهد و اولویت بالاتری دارد — سیستم تا پایان وظیفه آن را خاتمه نمیدهد. از Android 13، مجوز POST_NOTIFICATIONS الزامی است.
از Android ۶.۰، دستگاه در هنگام بیتحرکی به حالت Doze میرود. در این حالت عملیات شبکه، همگامسازی و JobScheduler به تعویق میافتند. WorkManager به طور خودکار با Doze سازگار میشود — وظایف در نزدیکترین Maintenance Window زمانی که دستگاه برای سرویسدهی از خواب بیدار میشود، اجرا میشوند.
iOS رویکرد سختگیرانهتری به اجرای پسزمینه دارد. Background App Refresh — مکانیزم اصلی بهروزرسانی دورهای دادهها. BGTaskScheduler — API برای برنامهریزی وظایف با در نظر گرفتن وضعیت سیستم. برای عملیات طولانی، Background Modes در دسترس است: audio، location، voip، fetch و processing.
Background App Refresh به برنامه اجازه میدهد هر ۱۵–۳۰ دقیقه برای همگامسازی دادهها بیدار شود. زمان بیدار شدن به رفتار کاربر بستگی دارد — سیستم تحلیل میکند که او چند وقت یکبار برنامه را باز میکند. کاربر میتواند این عملکرد را برای برنامههای خاص در Settings — General — Background App Refresh غیرفعال کند.
از iOS ۱۳، BGTaskScheduler جایگزین performFetch و beginBackgroundTask قدیمی شده است. برنامه وظایف را با شناسه و حداقل فاصله ثبت میکند، و سیستم خود زمان بهینه اجرا را تعیین میکند. وظایف به دو نوع تقسیم میشوند: BGProcessingTask (طولانی، ۱۰+ دقیقه) و BGAppRefreshTask (کوتاه، تا ۳۰ ثانیه).
iOS زمان محدودی برای اجرای وظیفه پسزمینه به برنامه اختصاص میدهد — تا ۳۰ ثانیه برای BGAppRefreshTask و تا ۱۰ دقیقه برای BGProcessingTask. پس از اتمام محدودیت، سیستم وظیفه را اجباری خاتمه میدهد. توسعهدهنده باید handler اتمام (expiration handler) را برای ذخیره نتایج موقت فراخوانی کند.
بیایید پیادهسازی عملی اجرای پسزمینه در Android را با WorkManager بررسی کنیم. نمونه همگامسازی دادهها هر ۸ ساعت با در نظر گرفتن وضعیت شبکه. WorkManager اجرای وظیفه را حتی پس از راهاندازی مجدد دستگاه تضمین میکند.
class SyncWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
return try {
syncDataToServer()
Log.d("Sync", "دادهها همگامسازی شدند")
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// اجرای وظیفه دورهای هر ۸ ساعت
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(false)
.build()
val syncRequest = PeriodicWorkRequestBuilder<SyncWorker>(
8, TimeUnit.HOURS
).setConstraints(constraints).build()
WorkManager.getInstance(context).enqueue(syncRequest)
برای عملیات طولانی قابل مشاهده برای کاربر، از Foreground Service استفاده کنید. نمونه دانلود فایل با پیشرفت در اعلان. سرویس startForeground() را با اعلانی که نمیتوان رد کرد فراخوانی میکند. پس از اتمام دانلود — stopForeground(STOP_FOREGROUND_REMOVE).
class DownloadService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, id: Int): Int {
startForeground(NOTIFICATION_ID, createNotification())
downloadFile()
stopForeground(STOP_FOREGROUND_REMOVE)
stopSelf()
return START_NOT_STICKY
}
private fun createNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("دانلود فایل")
.setSmallIcon(android.R.drawable.ic_download)
.build()
}
}
در iOS اجرای پسزمینه از طریق BGTaskScheduler پیکربندی میشود. نمونه ثبت و اجرای وظیفه بهروزرسانی محتوا. برنامه باید شناسه وظیفه را در Info.plist ثبت کند و submit را در زمان برنامهریزی وظیفه فراخوانی کند.
import BackgroundTasks
func registerBackgroundTask() {
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.app.refresh",
using: nil
) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
}
}
func scheduleAppRefresh() {
let request = BGAppRefreshTaskRequest(
identifier: "com.app.refresh"
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)
}
func handleAppRefresh(task: BGAppRefreshTask) {
scheduleAppRefresh()
task.expirationHandler = {
// ذخیره دادههای موقت
cacheCurrentState()
}
fetchLatestData {
task.setTaskCompleted(success: true)
}
}
برای عملیات طولانی (پاکسازی کش، پردازش دادهها) از BGProcessingTask استفاده کنید. سیستم تا ۱۰ دقیقه برای اجرا فرصت میدهد. فقط زمانی اجرا میشود که دستگاه به شارژر متصل و به Wi-Fi وصل باشد. نیاز به شناسه جداگانه در Info.plist و ثبت از طریق register(forTaskWithIdentifier:) دارد.
func scheduleProcessing() {
let request = BGProcessingTaskRequest(
identifier: "com.app.cleanup"
)
request.requiresExternalPower = true
request.requiresNetworkConnectivity = true
request.earliestBeginDate = Date(timeIntervalSinceNow: 24 * 60 * 60)
try? BGTaskScheduler.shared.submit(request)
}
Android و iOS در فلسفه اجرای پسزمینه تفاوت اساسی دارند. Android ابزارهای انعطافپذیر با کنترل زیاد ارائه میدهد، اما از توسعهدهنده انتخاب صحیح API را میطلبد. iOS امکانات را محدود میکند، اما عملکرد پایدار و استقلال را برای کاربر تضمین میکند.
| معیار | Android | iOS |
|---|---|---|
| API توصیهشده | WorkManager | BGTaskScheduler |
| حداکثر زمان وظیفه | نامحدود (Foreground Service) | ۳۰ ثانیه / ۱۰ دقیقه (processing) |
| وظایف دورهای | بله، از طریق PeriodicWorkRequest | بله، از طریق BGAppRefreshTask |
| تضمین اجرا | بله، حتی پس از راهاندازی مجدد | خیر — سیستم تصمیم میگیرد کی |
| دسترسی شبکه در پسزمینه | محدود شده توسط Doze mode | از طریق URLSession با background config |
| مکانیابی در پسزمینه | Foreground Service + مجوز | Background Mode location + NSLocation |
| صدا در پسزمینه | Foreground Service با اعلان رسانه | Background Mode audio + AVAudioSession |
WorkManager برای وظایفی که باید بدون توجه به وضعیت برنامه اجرا شوند بهینه است: همگامسازی دادهها، ارسال آمار، پردازش صفها. API تضمین میکند اجرا حتی پس از خاموش شدن دستگاه — وظیفه پس از بوت دوباره برنامهریزی میشود.
BGTaskScheduler برای وظایفی مناسب است که سیستم میتواند در هر زمان مناسب اجرا کند: دانلود محتوای جدید، بهروزرسانی ویجتها، پاکسازی کش. برای عملیات فوری مناسب نیست — اگر دستگاه در Doze باشد یا باتری کم باشد، سیستم وظیفه را به تعویق میاندازد.
سوالات متداول
Background Execution — مفهوم کلی است که هر کدی را که در پسزمینه اجرا میشود توصیف میکند. Background Modes — مکانیزم خاص iOS که به برنامه اجازه میدهد انواع خاصی از عملیات پسزمینه را اجرا کند: audio، geolocation، VoIP، fetch. Android از رویکرد مشابهی از طریق انواع Foreground Service استفاده میکند.
در iOS این محدودیت استاندارد برای BGAppRefreshTask است. سیستم پس از اتمام محدودیت وظیفه را اجباری خاتمه میدهد. در Android وضعیت مشابه زمانی رخ میدهد که برنامه از WorkManager یا Foreground Service استفاده نمیکند — Service معمولی پس از رفتن به پسزمینه توسط سیستم خاتمه مییابد.
در Android از WorkManager استفاده کنید — حتی پس از راهاندازی مجدد اجرا را تضمین میکند. در iOS نمیتوان اجرا را تضمین کرد — سیستم خود تصمیم میگیرد چه زمانی وظیفه را اجرا کند. تنها راه تضمین — استفاده از Background Modes (audio، location) با نشانگر قابل مشاهده برای کاربر.
در iOS UIApplication.shared.backgroundRefreshStatus را فراخوانی کنید — status .available، .denied یا .restricted. در Android از PowerManager.isIgnoringBatteryOptimizations() برای بررسی استثنا از بهینهسازی باتری استفاده کنید. برای WorkManager بررسی لازم نیست — API خود محدودیتهای سیستم را مدیریت میکند.
اعلانهای Push — مکانیزم اصلی برای ایجاد رویداد بدون کد پسزمینه. در iOS PushKit برای VoIP و Silent Push برای بهروزرسانی دادهها در دسترس است. در Android — High Priority FCM و Notification Trampoline. WebSockets از طریق Foreground Service — جایگزینی برای برنامههای real-time.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید