WorkManager یک کتابخانه Jetpack در Android است که برای انجام وظایف تأخیری و پسزمینه با تضمین اجرا طراحی شده است. به عنوان مثال، Service یا JobScheduler، WorkManager مدیریت چرخه عمر وظیفه را بر عهده میگیرد: در صورت شکست آن را مجدداً اجرا میکند، با نسخه Android سازگار میشود و محدودیتهای دستگاه را در نظر میگیرد. به استناد به Android Developers, 2026، WorkManager راهحل ترجیحی برای اکثر عملیات پسزمینه در توسعه مدرن Android است.
اصلی
WorkManager بخشی از Android Jetpack است، یک کتابخانه برای مدیریت وظایف پسزمینه که باید بهطور تضمینی اجرا شوند، فرق نمیکند که برنامه در پیش صفحه است یا توسط کاربر بسته شده است. کتابخانه از API 14+ پشتیبانی میکند و بهطور خودکار مکانیسم مناسب را انتخاب میکند: JobScheduler در Android 5+، BroadcastReceiver + AlarmManager در نسخههای کهنتر.
ویژگی کلیدی WorkManager تضمین اجراست. اگر وظیفه بهدلیل راهاندازی مجدد دستگاه، توقف برنامه یا شکست تکمیل نشده باشد، WorkManager آن را در اولین فرصت مجدداً اجرا میکند. این کتابخانه را به انتخابی ایدهآل برای وظایفی که اجرای آنها حیاتی است تبدیل میکند: ارسال آنالیتیک، همگامسازی پایگاه داده، بارگذاری فایلها.
به عنوان مثال، Background Service، WorkManager نیازی به مدیریت تردها و چرخه عمر ندارد. کتابخانه خود یک پول ترد ایجاد میکند، حالت Doze را مدیریت میکند، نسخه Android را در نظر میگیرد و صرفنظر از سطح API یک API واحد ارائه میدهد. کار با کوروتینها و RxJava از طریق CoroutineWorker و RxWorker پشتیبانی میشود.
WorkManager پشتیبانی داخلی LiveData را برای ریگاری وضعیت وظایف فراهم میکند. روش getWorkInfoByIdLiveData مقدار LiveData<WorkInfo> را بازمیگرداند که با هر تغییر وضعیت بهروز میشود: ENQUEUED، RUNNING، SUCCEEDED، FAILED، CANCELLED. این به اجزای UI امکان میدهد بدون پرسیش دستی زمانبندی و بدون نشت حافظه به لطف اجزای Lifecycle-aware به تغییرات واکنش نشان دهند.
WorkManager.getInstance(context)
.getWorkInfoByIdLiveData(syncRequest.id)
.observe(viewLifecycleOwner) { workInfo ->
when (workInfo.state) {
WorkInfo.State.SUCCEEDED ->
showSuccess()
WorkInfo.State.FAILED ->
showError(workInfo.outputData)
else ->
showProgress()
}
}
معماری WorkManager بر پایه سه کلاس اساسی ساخته شده است: Worker، WorkRequest و WorkManager. Worker شامل منطق وظیفه، WorkRequest پارامترهای اجرا را توصیف میکند و WorkManager صف و زمانبندی را مدیریت میکند. کتابخانه از یک پایگاه داده Room داخلی برای ذخیره وضعیت همه وظایف استفاده میکند.
Worker یک کلاس انتزاعی با تنها یک روش doWork است که در یک ترد پسزمینه فراخوانده میشود. روش مقدار ListenableWorker.Result را بازمیگرداند — SUCCESS، FAILURE یا RETRY. WorkRequest Worker را با پارامترها متصل میکند: مهلت زمانی، برچسب، تأخیر اولیه و محدودیتها.
class SyncWorker(
context: Context,
params: WorkerParameters
) : Worker(context, params) {
override fun doWork(): Result {
return try {
val api = RetrofitClient.api
val response = api.syncData()
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
WorkManager بدون توجه به نسخه Android وظایف را یکپارچه برنامهریزی میکند. در طول فراخوانی enqueue، کتابخانه وظیفه را در Room ذخیره میکند، شرایط فعلی را ارزیابی میکند و زمان شروع بهینه را انتخاب میکند. در پشت صحنه ممکن است از JobScheduler، AlarmManager یا زمانبند خود استفاده شود — توسعهدهنده نباید به این موضوع فکر کند.
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(15, TimeUnit.MINUTES)
.addTag("sync")
.build()
WorkManager.getInstance(context)
.enqueue(syncRequest)
WorkManager از دو نوع درخواست اجرا پشتیبانی میکند: یکبار و دورهای. انتخاب نوع بستگی به سناریو دارد: وظیفه باید یک بار اجرا شود یا در یک فاصله مشخص تکرار شود.
OneTimeWorkRequest برای وظایفی است که باید یکبار اجرا شوند. این میتواند ارسال لاگ، همگامسازی دادهها پس از ورود، بارگیری تنظیمات در نخستین شروع باشد. تأخیر از طریق setInitialDelay و محدودیتها از طریق setConstraints تنظیم میشود.
PeriodicWorkRequest برای وظایف تکراری با حداقل فاصله 15 دقیقه مناسب است. کتابخانه تضمین میدهد که فاصله بین اجراها از مقدار مشخص شده کمتر نباشد، اما ممکن است به دلیل محدودیتهای دستگاه بیشتر باشد. برای وظایفی با دفعه کمتر از 15 دقیقه، از Handler یا Timer در Foreground Service استفاده کنید.
| پارامتر | OneTimeWorkRequest | PeriodicWorkRequest |
|---|---|---|
| دفعه | یکبار | تکراری (حداقل 15 دقیقه) |
| تعداد | 1 اجرا | تا لغو |
| تأخیر | setInitialDelay | setInitialDelay |
| زنجیرهها | پشتیبانی میکند | نه |
| کاربرد | بارگیری، همگامسازی | نظارت، پولینگ |
محدودیتها (constraints) در WorkManager به شما امکان میدهند شرایطی را مشخص کنید که وظیفه میتواند آغاز شود: اتصال شبکه (NetworkType)، سطح باتری (batteryNotLow)، وضعیت حافظه (StorageNotLow) و حالت انتظار (DeviceIdle). وظیفه تا برآورده نشدن تمام محدودیتها شروع نخواهد شد.
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.build()
val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
.setConstraints(constraints)
.build()
زنجیرهها (chaining) امکان اجرای پیشرو یا موازی وظایف را فراهم میکنند. beginWith زنجیره را شروع میکند، then Worker بعدی را اضافه میکند که پس از تکمیل موفقیتآمیز قبلی اجرا خواهد شد. برای اجرای موازی از workManager.enqueue(listOf(request1, request2)) استفاده کنید.
WorkManager.getInstance(context)
.beginWith(compressWorker)
.then(uploadWorker)
.then(cleanupWorker)
.enqueue()
// compress → upload → cleanup بهصورت پیشرو
JobScheduler در Android 5 (API 21) به عنوان یک خدمت سیستم برای برنامهریزی وظایف پسزمینه معرفی شد. WorkManager با ارائه یک API چند سیستمی با مهاجرت خودکار و قابلیتهای افزوده جایگزین آن شد: زنجیرهها، تضمین اجرا، برچسبها، مشاهده وضعیت از طریق LiveData.
در مهاجرت از JobScheduler به WorkManager، باید JobService را به Worker، JobInfo را به WorkRequest و Context.getSystemService را به API WorkManager تبدیل کنید. WorkManager بهطور خودکار مشکلات سازگاری را حل میکند و حالت Doze را بهتر از پیادهسازی دستی JobScheduler مدیریت میکند. مراحل مهاجرت: 1) کلاس Worker ایجاد کنید، 2) WorkRequest را با همان شرایط بسازید، 3) JobService و JobInfo را از کد و مانیفست حذف کنید.
WorkManager از مفهوم وظایف منحصربهفرد از طریق ExistingWorkPolicy پشتیبانی میکند. اگر وظیفهای با نام مشخص از قبل وجود داشته باشد، سیاست رفتار را مشخص میکند: KEEP (جدید نساز)، REPLACE (موجود را جایگزین کن)، APPEND (به انتهای زنجیره اضافه کن) و APPEND_OR_REPLACE. UniqueWorkRequest برای وظایفی که نباید تکرار شوند مناسب است: همگامسازی پایگاه داده، بارگیری تنظیمات، ارسال بسته آنالیتیک.
WorkManager.getInstance(context)
.enqueueUniqueWork(
"sync_data",
ExistingWorkPolicy.KEEP,
syncRequest
)
CoroutineWorker از مکانیسم setProgress پشتیبانی میکند که امکان ارسال نتایج میانی اجرای وظیفه را فراهم میکند. این برای عملیات طولانی مفید است: بارگیری فایل بزرگ، پردازش تصاویر تودهای، مهاجرت پایگاه داده. UI میتواند از طریق getWorkInfosByTagLiveData در بهروزرسانیها مشترک شود و پیشرفت را بهصورت بلافاصله نمایش دهد. روش ForegroundInfo نیز برای اجرای Worker به عنوان Foreground Service با اعلام در دسترس است اگر وظیفه باید برای کاربر قابل مشاهده باشد.
class ProgressWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
val total = 100
for (i in 1..total) {
setProgress(
workDataOf("progress" to i)
)
}
return Result.success()
}
}
WorkManager انتقال داده بین Worker-ها را از طریق InputData و OutputData پشتیبانی میکند. InputData در مرحله ساختن WorkRequest از طریق Data.Builder ایجاد میشود و از طریق inputData به Worker ارسال میشود. پس از اجرا، Worker OutputData را از طریق workDataOf یا Data.Builder ایجاد و همراه با Result.success(outputData) بازمیگرداند. Worker بعدی در زنجیره outputData قبلی را به عنوان inputData خود دریافت میکند. دادهها در قالب کلید-مقدار با پشتیبانی از انواع پایه ذخیره میشوند: String، Int، Long، Boolean، Double. حداکثر اندازه Data 10 KB است.
در عمل، بسیاری از پروژهها از WorkManager به عنوان تنها زمانبند وظایف پسزمینه استفاده میکنند. Google توصیه میکند همه JobService-های موجود را به WorkManager مهاجرت دهید، بهویژه در برنامههایی که از Android 4.4 (API 19) و پایینتر پشتیبانی میکنند، جایی که JobScheduler در دسترس نیست و WorkManager از مکانیسم پشتیبان از طریق AlarmManager و BroadcastReceiver استفاده میکند. برای آزمایش، WorkManager TestListenableWorkerBuilder و TestWorkerBuilder را فراهم میکند که به شما امکان آزمایش Worker-ها را در آزمایشهای JUnit بدون زمانبند واقعی میدهند.
برای آزمایش WorkManager از TestListenableWorkerBuilder از AndroidX Test استفاده کنید که به شما امکان اجرای Worker در محیط ایزوله و بررسی Result بازگشتی را میدهد. کتابخانه پشتیبانی کامل JUnit و Robolectric را برای آزمایش واحد بدون زمانبند واقعی فراهم میکند. بهطور کلی، WorkManager برای 80% وظایفی که قبلاً از Service یا JobScheduler استفاده میکردند مناسب است.
سوالات متداول
بله، WorkManager حتی پس از راهاندازی مجدد اجرا را تضمین میکند. کتابخانه همه وظایف ناتمام را در پایگاه داده Room ذخیره میکند و آنها را از طریق BroadcastReceiver که پس از بارگیری سیستم فعال میشود بازیابی میکند.
Worker بدون پشتیبانی از کوروتین یا RxJava در یک ترد پسزمینه کار میکند. CoroutineWorker از کوروتینهای Kotlin با پشتیبانی از توابع suspend و لغو در scope کوروتین استفاده میکند. RxWorker با Observable و Single کار میکند و برای زنجیرههای واکنشی مناسب است.
برای لغو از workManager.cancelWorkById(id) یا workManager.cancelAllWorkByTag("tag") استفاده کنید. کتابخانه همچنین روش cancelUniqueWork("name") را برای لغو وظایف منحصربهفرد با نام مشخص ارائه میدهد.
حداقل فاصله برای PeriodicWorkRequest 15 دقیقه است. این محدودیت توسط Google برای جلوگیری از مصرف بیش از حد باتری تعیین شده است. اگر وظیفه باید با دفعه بیشتری اجرا شود، از Foreground Service یا Handler با تایمر استفاده کنید.
بله، WorkManager از API 14+ پشتیبانی میکند. در دستگاههایی بدون JobScheduler (پایینتر از API 21)، کتابخانه از ترکیب AlarmManager و BroadcastReceiver برای برنامهریزی وظایف استفاده میکند. این WorkManager را به یک راهحل همگانی برای وظایف پسزمینه تبدیل میکند.
نتیجه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید