بارگذاری دادهها، همگامسازی محتوا، ارسال تحلیل — بسیاری از وظایف به مشارکت فعال کاربر نیاز ندارند. با این حال، دستگاههای موبایل کار پسزمینه را برای صرفهجویی در باتری و حفظ عملکرد محدود میکنند. وظایف پسزمینه (background tasks) مکانیزمهایی هستند که به برنامه اجازه میدهند وقتی کاربر آن را نمیبیند، کد اجرا کند. در این مقاله به بررسی WorkManager، BGTaskScheduler، Foreground Service و ویژگیهای Doze Mode میپردازیم. جزئیات بیشتر در مستندات رسمی WorkManager.
نکات کلیدی
وظیفه پسزمینه هر کدی است که وقتی برنامه در پیشزمینه (صفحه فعال) نیست اجرا میشود. این میتواند شامل: همگامسازی دورهای داده با سرور، دانلود فایلهای حجیم، پردازش اعلانهای push، ردیابی موقعیت جغرافیایی، بهروزرسانی ویجتها باشد. هر پلتفرم محدودیتهای خود را برای کار پسزمینه دارد: iOS سختگیرانهتر است (10–30 دقیقه زمان پسزمینه)، Android انعطافپذیرتر است اما از نسخه 9 قوانین را سختتر کرده است.
معماری وظایف پسزمینه بر سه سطح ساخته شده است: (1) وظایف فوری — بلافاصله اجرا میشوند (Foreground Service)؛ (2) وظایف به تأخیر افتاده — در شرایط مناسب اجرا میشوند (WorkManager، BGTaskScheduler)؛ (3) وظایف دورهای — در بازه زمانی مشخص تکرار میشوند. انتخاب سطح صحیح تعیین میکند که آیا وظیفه به موقع تکمیل میشود و آیا منجر به رد شدن برنامه توسط فروشگاه میشود.
در هر دو پلتفرم، Google/Apple به شدت توصیه میکنند که به جای مدیریت مستقیم رشتهها در پسزمینه، از APIهای اعلامی استفاده کنید. WorkManager در Android و BGTaskScheduler در iOS به سیستم اجازه میدهند تا کار پسزمینه را به طور بهینه بین برنامهها توزیع کند و وظایف را برای صرفهجویی در انرژی گروهبندی کند. در IT Sectr، ما همیشه طراحی معماری پسزمینه را با تحلیل نیازهای فرکانس و فوریت بهروزرسانیها آغاز میکنیم.
iOS چندین مکانیزم برای کار پسزمینه فراهم میکند. Background Fetch — بهروزرسانی دورهای محتوا با بازه زمانی تعیین شده توسط سیستم (نه توسعهدهنده). برنامه یک پنجره حدود 30 ثانیه برای دانلود دادههای جدید دریافت میکند. Background Fetch از طریق Capabilities → Background Modes → Background Fetch فعال میشود و در AppDelegate پیادهسازی میشود: application(_:performFetchWithCompletionHandler:).
BGTaskScheduler API مدرن برای iOS 13+ است که جایگزین Background Fetch میشود. توسعهدهنده یک وظیفه را با یک شناسه ثبت میکند و سیستم آن را در شرایط مناسب اجرا میکند. BGAppRefreshTask — برای بهروزرسانیهای کوتاه محتوا؛ BGProcessingTask — برای وظایف طولانی (پاکسازی حافظه نهان، همگامسازی پایگاه داده). وظایف هنگام راهاندازی برنامه ثبت میشوند و سیستم با در نظر گرفتن وضعیت باتری، شبکه و فعالیت کاربر، اجرای آنها را زمانبندی میکند.
Background Modes — فهرستی از حالتها که کار پسزمینه را برای سناریوهای خاص مجاز میکنند: Audio (پخش پسزمینه)، Location (ردیابی GPS)، VoIP (تماس از طریق PushKit)، BLE (اتصال به دستگاههای بلوتوث)، Processing (وظایف طولانی از طریق BGTaskScheduler). هر حالت نیاز به توجیه در بررسی App Store دارد. استفاده از حالتها بدون نیاز واقعی، دلیل رایج رد شدن برنامه است.
Significant Location Change — مکانیزمی برای برنامههایی که به موقعیت جغرافیایی مداوم نیاز ندارند اما باید از جابجایی قابل توجه کاربر (بیش از 500 متر) مطلع شوند. سیستم هنگام تغییر دکل مخابراتی برنامه را بیدار میکند. این مکانیزم در مقایسه با ردیابی مداوم GPS، به طور قابل توجهی در باتری صرفهجویی میکند.
Android غنیترین مجموعه APIها را برای وظایف پسزمینه ارائه میدهد، اما از نسخه 8.0 (API 26) قوانین سختتر شده است. WorkManager راهحل توصیه شده توسط Google برای همه انواع وظایف پسزمینه است. WorkManager اجرای وظیفه را حتی پس از راهاندازی مجدد دستگاه تضمین میکند (از طریق BootReceiver) و از زنجیره وظایف، LiveData/Flow قابل مشاهده و سازگاری معکوس تا API 14 پشتیبانی میکند.
WorkManager از Worker استفاده میکند — یک کلاس پایه با متد doWork(). Constraints شرایط اجرا را تعریف میکند: NetworkType.CONNECTED، BatteryNotLow، StorageNotLow. PeriodicWorkRequest — برای وظایف دورهای با حداقل فاصله 15 دقیقه. WorkManager به طور خودکار با Doze Mode و App Standby سازگار میشود، وظایف را در پنجرههای نگهداری گروهبندی میکند. مثال یک Worker ساده:
class SyncWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
return try {
val repository =
Injection.provideRepository(applicationContext)
repository.syncData()
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// Запланировать задачу
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(constraints)
.build()
WorkManager.getInstance(context)
.enqueue(syncRequest)
JobScheduler — API قدیمیتر (Android 5+، API 21). وظایف را با شرایط مشخص (شبکه، شارژ، بیکار) زمانبندی میکند. محدودیت: از راهاندازی مجدد دستگاه پشتیبانی نمیکند (نیاز به BootReceiver دارد) و حالت قابل مشاهده ندارد. JobScheduler برای وظایف ساده در پروژههای قدیمی مناسب است؛ برای پروژههای جدید از WorkManager استفاده کنید.
Foreground Service — سرویسی که کاربر از طریق یک اعلان دائمی (ongoing notification) میبیند. برای موارد زیر استفاده میشود: پخش موسیقی، ردیابی GPS، دانلود فایلهای حجیم. Foreground Service اولویت بالایی دارد — سیستم هنگام کمبود حافظه آن را نمیکشد. از Android 13، برای برخی انواع مجوز FOREGROUND_SERVICE_SPECIAL_USE لازم است. یک جایگزین WorkManager با ForegroundServiceOption است (وظایف طولانی).
AlarmManager — برای وظایفی که باید در زمان دقیق اجرا شوند (زنگ هشدار، یادآوری). AlarmManager میتواند دستگاه را از Doze Mode بیدار کند (setAlarmClock). به دلیل مصرف بالای انرژی برای همگامسازی منظم توصیه نمیشود. برای وظایف دورهای از WorkManager استفاده کنید و AlarmManager فقط زمانی که زمان دقیق حیاتی است.
| سناریو | iOS | Android |
|---|---|---|
| بهروزرسانی دورهای محتوا | BGAppRefreshTask (BGTaskScheduler) | WorkManager (PeriodicWorkRequest) |
| وظیفه طولانی پسزمینه | BGProcessingTask | WorkManager + ForegroundService |
| پخش صدا | Background Audio Mode | Foreground Service |
| ردیابی GPS | Significant Location Change / Background Location | Foreground Service + FusedLocationProvider |
| VoIP / تماس | PushKit + CallKit | ConnectionService + Foreground Service |
| زمان دقیق (زنگ هشدار) | UNNotificationRequest (calendar) | AlarmManager |
| پردازش push (پسزمینه) | Notification Service Extension | FirebaseMessagingService (onMessageReceived) |
Doze Mode یک حالت صرفهجویی در انرژی در Android است که بر اجرای وظایف پسزمینه تأثیر میگذارد. در Android 6.0 (API 23) معرفی شد. وقتی دستگاه شارژ نمیشود، صفحه خاموش است و دستگاه بیحرکت است، Doze Mode درخواستهای شبکه را مسدود میکند، JobScheduler و WakeLock را به تأخیر میاندازد. به طور دورهای، Doze پنجرههای نگهداری باز میکند — فواصل کوتاهی که برنامهها میتوانند وظایف به تأخیر افتاده را اجرا کنند. از Android 7.0 (API 24)، Doze زمانی که صفحه خاموش است فعال میشود، نه فقط در بیحرکتی کامل.
App Standby — حالتی که در آن برنامههای استفاده نشده در حالت آمادهباش قرار میگیرند. اگر یک برنامه اعلان فعال نداشته باشد و چند روز باز نشده باشد، در یک Standby Bucket قرار میگیرد: فعال (active)، working، frequent، rare. هرچه برنامه کمتر استفاده شود، محدودیتها سختتر میشوند: درخواستهای شبکه به تأخیر میافتند، همگامسازی مسدود میشود، JobScheduler اجرا نمیشود.
WakeLock — مکانیزمی که دستگاه را بیدار نگه میدارد (از خوابیدن آن جلوگیری میکند). برای تکمیل عملیات مهم استفاده میشود. WakeLock باید پس از اتمام وظیفه آزاد شود (release)، در غیر این صورت باتری در عرض چند ساعت تخلیه میشود. WakeLock در Doze Mode کار نمیکند — سیستم آن را نادیده میگیرد. کار با WakeLock در Android 8+ نیاز به مجوز WAKE_LOCK و مدیریت صحیح چرخه حیات دارد.
در IT Sectr، ما Doze Mode و App Standby را در مرحله طراحی در نظر میگیریم. WorkManager به طور خودکار این حالتها را مدیریت میکند، اما برای Foreground Service باید مدیریت صحیح انتقال به Doze برنامهریزی شود. توصیه میشود کار پسزمینه را در دستگاههای واقعی با حالت صرفهجویی در انرژی فعال و پس از دورههای طولانی بیکاری آزمایش کنید.
هنگام طراحی وظایف پسزمینه، این نکات را دنبال کنید. 1. همیشه از WorkManager استفاده کنید برای پروژههای جدید Android. مشکلات سازگاری، Doze Mode و راهاندازی مجدد دستگاه را حل میکند. 2. در iOS، برای iOS 13+ به جای Background Fetch از BGTaskScheduler استفاده کنید. 3. از Foreground Service فقط زمانی استفاده کنید که وظیفه واقعاً به یک اعلان قابل مشاهده نیاز دارد. 4. از WakeLock سوءاستفاده نکنید — باتری را تخلیه میکند و میتواند منجر به رد شدن برنامه شود. 5. وظایف پسزمینه را در Doze Mode آزمایش کنید: adb shell dumpsys deviceidle force-idle. 6. همیشه تکمیل وظیفه را از طریق ثبت و تحلیل تأیید کنید. 7. محدودیتها را به خاطر بسپارید: iOS حدود 30 ثانیه برای Background Fetch و حدود چند دقیقه برای BGProcessingTask میدهد. Android WorkManager زمان دقیق اجرا را تضمین نمیکند.
سوالات متداول
Background Service بدون اعلان قابل مشاهده اجرا میشود و ممکن است در هر زمان توسط سیستم کشته شود. Foreground Service باید یک اعلان دائمی (ongoing notification) نمایش دهد و اولویت بالاتری دارد. Foreground Service برای پخش موسیقی و ردیابی GPS استفاده میشود.
Doze Mode یک حالت صرفهجویی در انرژی Android است که دسترسی به شبکه را غیرفعال میکند و JobScheduler/WakeLock را به تأخیر میاندازد وقتی دستگاه استفاده نمیشود. WorkManager با Doze Mode به طور خودکار سازگار میشود.
در iOS، وظایف پسزمینه از طریق Background Fetch (بهروزرسانی دورهای)، BGTaskScheduler (وظایف به تأخیر افتاده) یا Background Modes (صدا، VoIP، BLE، مکان) اجرا میشوند. BGTaskScheduler API مدرن برای iOS 13+ است که جایگزین Background Fetch میشود.
WorkManager راهحل توصیه شده Google برای همه وظایف پسزمینه در Android است. JobScheduler یک API قدیمی با قابلیتهای محدود است. WorkManager از زنجیره وظایف، LiveData/Flow قابل مشاهده و سازگاری معکوس تا API 14 پشتیبانی میکند.
App Standby حالتی در Android است که در آن برنامههای استفاده نشده در وضعیت آمادهباش قرار میگیرند: درخواستهای شبکه به تأخیر میافتند، همگامسازی متوقف میشود. اگر برنامهای برای چند روز استفاده نشود، Android آن را در یک Standby Bucket (active، working، frequent، rare) قرار میدهد.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.