WorkManager — این چیست، API و برنامه‌ریزی وظایف

نویسنده: IT Sectr منتشر شده: 2026-03-27 زمان مطالعه: 8 دقیقه

WorkManager یک کتابخانه Jetpack در Android است که برای انجام وظایف تأخیری و پس‌زمینه با تضمین اجرا طراحی شده است. به عنوان مثال، Service یا JobScheduler، WorkManager مدیریت چرخه عمر وظیفه را بر عهده می‌گیرد: در صورت شکست آن را مجدداً اجرا می‌کند، با نسخه Android سازگار می‌شود و محدودیت‌های دستگاه را در نظر می‌گیرد. به استناد به Android Developers, 2026، WorkManager راهحل ترجیحی برای اکثر عملیات پس‌زمینه در توسعه مدرن Android است.

اصلی

  • WorkManager یک کتابخانه Jetpack برای وظایف پس‌زمینه با اجرای تضمینی، مستقل از نسخه Android است.
  • Worker کلاس پایه برای تعریف منطق وظیفه پس‌زمینه است که کتابخانه آن را در یک ترد جداگانه اجرا می‌کند.
  • WorkRequest می‌تواند یکبار (OneTimeWorkRequest) یا دوره‌ای (PeriodicWorkRequest) با حداقل فاصله 15 دقیقه باشد.
  • زنجیره‌های وظایف امکان اجرای پیشرو یا موازی چندین Worker را فراهم می‌کنند.
  • محدودیت‌ها (constraints) شرایط شروع را مشخص می‌کنند: سطح باتری، اتصال شبکه، وضعیت حافظه.

WorkManager چیست؟

WorkManager بخشی از Android Jetpack است، یک کتابخانه برای مدیریت وظایف پس‌زمینه که باید بهطور تضمینی اجرا شوند، فرق نمی‌کند که برنامه در پیش صفحه است یا توسط کاربر بسته شده است. کتابخانه از API 14+ پشتیبانی می‌کند و بهطور خودکار مکانیسم مناسب را انتخاب می‌کند: JobScheduler در Android 5+، BroadcastReceiver + AlarmManager در نسخه‌های کهن‌تر.

ویژگی کلیدی WorkManager تضمین اجراست. اگر وظیفه به‌دلیل راه‌اندازی مجدد دستگاه، توقف برنامه یا شکست تکمیل نشده باشد، WorkManager آن را در اولین فرصت مجدداً اجرا می‌کند. این کتابخانه را به انتخابی ایده‌آل برای وظایفی که اجرای آن‌ها حیاتی است تبدیل می‌کند: ارسال آنالیتیک، همگام‌سازی پایگاه داده، بارگذاری فایل‌ها.

به عنوان مثال، Background Service، WorkManager نیازی به مدیریت تردها و چرخه عمر ندارد. کتابخانه خود یک پول ترد ایجاد می‌کند، حالت Doze را مدیریت می‌کند، نسخه Android را در نظر می‌گیرد و صرف‌نظر از سطح API یک API واحد ارائه می‌دهد. کار با کوروتین‌ها و RxJava از طریق CoroutineWorker و RxWorker پشتیبانی می‌شود.

مشاهده وضعیت از طریق LiveData

WorkManager پشتیبانی داخلی LiveData را برای ریگاری وضعیت وظایف فراهم می‌کند. روش getWorkInfoByIdLiveData مقدار LiveData<WorkInfo> را بازمی‌گرداند که با هر تغییر وضعیت به‌روز می‌شود: ENQUEUED، RUNNING، SUCCEEDED، FAILED، CANCELLED. این به اجزای UI امکان می‌دهد بدون پرسیش دستی زمان‌بندی و بدون نشت حافظه به لطف اجزای Lifecycle-aware به تغییرات واکنش نشان دهند.

kotlin
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 چگونه کار می‌کند؟

معماری WorkManager بر پایه سه کلاس اساسی ساخته شده است: Worker، WorkRequest و WorkManager. Worker شامل منطق وظیفه، WorkRequest پارامترهای اجرا را توصیف می‌کند و WorkManager صف و زمان‌بندی را مدیریت می‌کند. کتابخانه از یک پایگاه داده Room داخلی برای ذخیره وضعیت همه وظایف استفاده می‌کند.

Worker و WorkRequest

Worker یک کلاس انتزاعی با تنها یک روش doWork است که در یک ترد پس‌زمینه فراخوانده می‌شود. روش مقدار ListenableWorker.Result را بازمی‌گرداند — SUCCESS، FAILURE یا RETRY. WorkRequest Worker را با پارامترها متصل می‌کند: مهلت زمانی، برچسب، تأخیر اولیه و محدودیت‌ها.

kotlin
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

WorkManager بدون توجه به نسخه Android وظایف را یکپارچه برنامه‌ریزی می‌کند. در طول فراخوانی enqueue، کتابخانه وظیفه را در Room ذخیره می‌کند، شرایط فعلی را ارزیابی می‌کند و زمان شروع بهینه را انتخاب می‌کند. در پشت صحنه ممکن است از JobScheduler، AlarmManager یا زمان‌بند خود استفاده شود — توسعه‌دهنده نباید به این موضوع فکر کند.

kotlin
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInitialDelay(15, TimeUnit.MINUTES)
    .addTag("sync")
    .build()

WorkManager.getInstance(context)
    .enqueue(syncRequest)

انواع WorkRequest

WorkManager از دو نوع درخواست اجرا پشتیبانی می‌کند: یکبار و دوره‌ای. انتخاب نوع بستگی به سناریو دارد: وظیفه باید یک بار اجرا شود یا در یک فاصله مشخص تکرار شود.

OneTimeWorkRequest

OneTimeWorkRequest برای وظایفی است که باید یکبار اجرا شوند. این می‌تواند ارسال لاگ، همگام‌سازی داده‌ها پس از ورود، بارگیری تنظیمات در نخستین شروع باشد. تأخیر از طریق setInitialDelay و محدودیت‌ها از طریق setConstraints تنظیم می‌شود.

PeriodicWorkRequest

PeriodicWorkRequest برای وظایف تکراری با حداقل فاصله 15 دقیقه مناسب است. کتابخانه تضمین می‌دهد که فاصله بین اجراها از مقدار مشخص شده کمتر نباشد، اما ممکن است به دلیل محدودیت‌های دستگاه بیشتر باشد. برای وظایفی با دفعه کمتر از 15 دقیقه، از Handler یا Timer در Foreground Service استفاده کنید.

پارامترOneTimeWorkRequestPeriodicWorkRequest
دفعهیکبارتکراری (حداقل 15 دقیقه)
تعداد1 اجراتا لغو
تأخیرsetInitialDelaysetInitialDelay
زنجیره‌هاپشتیبانی می‌کندنه
کاربردبارگیری، همگام‌سازینظارت، پولینگ

تنظیم محدودیت‌ها و زنجیره‌های وظایف

محدودیت‌ها (constraints) در WorkManager به شما امکان می‌دهند شرایطی را مشخص کنید که وظیفه می‌تواند آغاز شود: اتصال شبکه (NetworkType)، سطح باتری (batteryNotLow)، وضعیت حافظه (StorageNotLow) و حالت انتظار (DeviceIdle). وظیفه تا برآورده نشدن تمام محدودیت‌ها شروع نخواهد شد.

kotlin
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)) استفاده کنید.

kotlin
WorkManager.getInstance(context)
    .beginWith(compressWorker)
    .then(uploadWorker)
    .then(cleanupWorker)
    .enqueue()
    // compress → upload → cleanup به‌صورت پیشرو

مهاجرت از JobScheduler به WorkManager

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 را از کد و مانیفست حذف کنید.

UniqueWork برای وظایف منحصربه‌فرد

WorkManager از مفهوم وظایف منحصربه‌فرد از طریق ExistingWorkPolicy پشتیبانی می‌کند. اگر وظیفه‌ای با نام مشخص از قبل وجود داشته باشد، سیاست رفتار را مشخص می‌کند: KEEP (جدید نساز)، REPLACE (موجود را جایگزین کن)، APPEND (به انتهای زنجیره اضافه کن) و APPEND_OR_REPLACE. UniqueWorkRequest برای وظایفی که نباید تکرار شوند مناسب است: همگام‌سازی پایگاه داده، بارگیری تنظیمات، ارسال بسته آنالیتیک.

kotlin
WorkManager.getInstance(context)
    .enqueueUniqueWork(
        "sync_data",
        ExistingWorkPolicy.KEEP,
        syncRequest
    )

پیشرفت و نتایج میانی

CoroutineWorker از مکانیسم setProgress پشتیبانی می‌کند که امکان ارسال نتایج میانی اجرای وظیفه را فراهم می‌کند. این برای عملیات طولانی مفید است: بارگیری فایل بزرگ، پردازش تصاویر توده‌ای، مهاجرت پایگاه داده. UI می‌تواند از طریق getWorkInfosByTagLiveData در به‌روزرسانی‌ها مشترک شود و پیشرفت را به‌صورت بلافاصله نمایش دهد. روش ForegroundInfo نیز برای اجرای Worker به عنوان Foreground Service با اعلام در دسترس است اگر وظیفه باید برای کاربر قابل مشاهده باشد.

kotlin
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()
    }
}

InputData و OutputData برای انتقال داده

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 اجرای وظیفه پس از راه‌اندازی مجدد دستگاه را تضمین می‌کند؟

بله، WorkManager حتی پس از راه‌اندازی مجدد اجرا را تضمین می‌کند. کتابخانه همه وظایف ناتمام را در پایگاه داده Room ذخیره می‌کند و آن‌ها را از طریق BroadcastReceiver که پس از بارگیری سیستم فعال می‌شود بازیابی می‌کند.

تفاوت بین Worker، CoroutineWorker و RxWorker چیست؟

Worker بدون پشتیبانی از کوروتین یا RxJava در یک ترد پس‌زمینه کار می‌کند. CoroutineWorker از کوروتین‌های Kotlin با پشتیبانی از توابع suspend و لغو در scope کوروتین استفاده می‌کند. RxWorker با Observable و Single کار می‌کند و برای زنجیره‌های واکنشی مناسب است.

چگونه می‌توان یک وظیفه را در WorkManager لغو کرد؟

برای لغو از workManager.cancelWorkById(id) یا workManager.cancelAllWorkByTag("tag") استفاده کنید. کتابخانه همچنین روش cancelUniqueWork("name") را برای لغو وظایف منحصربه‌فرد با نام مشخص ارائه می‌دهد.

حداقل فاصله برای PeriodicWorkRequest چقدر است؟

حداقل فاصله برای PeriodicWorkRequest 15 دقیقه است. این محدودیت توسط Google برای جلوگیری از مصرف بیش از حد باتری تعیین شده است. اگر وظیفه باید با دفعه بیشتری اجرا شود، از Foreground Service یا Handler با تایمر استفاده کنید.

آیا WorkManager از Android 4.4 و پایین‌تر پشتیبانی می‌کند؟

بله، WorkManager از API 14+ پشتیبانی می‌کند. در دستگاه‌هایی بدون JobScheduler (پایین‌تر از API 21)، کتابخانه از ترکیب AlarmManager و BroadcastReceiver برای برنامه‌ریزی وظایف استفاده می‌کند. این WorkManager را به یک راهحل همگانی برای وظایف پس‌زمینه تبدیل می‌کند.

نتیجه

  • WorkManager یک کتابخانه مدرن Jetpack برای وظایف پس‌زمینه با اجرای تضمینی در همه نسخه‌های Android است.
  • سه کلاس اساسی — Worker، WorkRequest و WorkManager — همه سناریوهای برنامه‌ریزی و اجرا را پوشش می‌دهند.
  • دو نوع درخواست — OneTimeWorkRequest و PeriodicWorkRequest — برای وظایف یکبار و تکراری.
  • محدودیت‌ها (شبکه، باتری، حافظه) وظیفه را از اجرا در شرایط نامناسب محافظت می‌کنند.
  • زنجیره‌های وظایف اجرای پیشرو Worker-ها را با انتقال نتیجه تضمین می‌کنند.
  • CoroutineWorker و RxWorker از برنامه‌نویسی ناهمگام از طریق کوروتین و RxJava پشتیبانی می‌کنند.
  • WorkManager در اکثر سناریوهای وظایف پس‌زمینه جایگزین JobScheduler، Service و AlarmManager است.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید