JobScheduler: مفهوم، API و برنامه‌ریزی وظایف

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

JobScheduler — سرویس سیستمی Android است که در API 21 (Android 5.0 Lollipop) معرفی شد و به برنامه‌ها اجازه می‌دهد اجرای وظایف پس‌زمینه را بر اساس شرایط مشخصی برنامه‌ریزی کنند. برخلاف AlarmManager، JobScheduler به زمان دقیق راه‌اندازی نیاز ندارد — سیستم خود لحظه بهینه را با ترکیب نیازهای برنامه با وضعیت فعلی دستگاه تعیین می‌کند. به گفته Android Developers, 2026، این سرویس از معیارهای شبکه، شارژ، وضعیت ذخیره‌سازی و بیکار بودن دستگاه پشتیبانی می‌کند.

نکات اصلی

  • JobScheduler — API سیستمی Android 5+ برای پردازش دسته‌ای وظایف پس‌زمینه با شرایط راه‌اندازی است.
  • JobService — کلاس پایه پردازش‌گر که وقتی شرایط اجرا برآورده شد توسط سیستم فراخوانی می‌شود.
  • JobInfo — شیئی که پارامترهای وظیفه را توصیف می‌کند: نوع شبکه، شارژ باتری، ددلاین و تأخیر.
  • معیارهای راه‌اندازی شامل اتصال به Wi-Fi، شارژ شدن، وجود فضای خالی و بیکار بودن دستگاه است.
  • WorkManager در Android 5+ از JobScheduler در زیرساخت استفاده می‌کند و API سطح بالاتری ارائه می‌دهد.

JobScheduler چیست؟

JobScheduler — سرویس سیستمی Android است که چندین وظیفه پس‌زمینه را در بسته‌هایی برای کاهش مصرف انرژی ترکیب می‌کند. به جای اینکه هر برنامه به طور جداگانه دستگاه را بیدار کند، JobScheduler آنها را گروه‌بندی کرده و در لحظه بهینه، زمانی که دستگاه در حال حاضر فعال است، اجرا می‌کند. این کار عمر باتری را به طور قابل توجهی افزایش می‌دهد.

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

اصل کار بر اساس شی JobInfo است که برنامه به JobScheduler ارسال می‌کند. سیستم وظیفه را ذخیره می‌کند و زمانی که تمام شرایط مشخص شده برآورده شوند، آن را راه‌اندازی می‌کند. برخلاف WorkManager، JobScheduler راه‌اندازی مجدد را در صورت خرابی تضمین نمی‌کند — اگر وظیفه با استثنا شکست بخورد، توسعه‌دهنده باید خودش دوباره آن را برنامه‌ریزی کند.

JobScheduler چگونه کار می‌کند؟

JobScheduler از معماری مبتنی بر JobService و JobInfo استفاده می‌کند. JobInfo وظیفه و شرایط آن را توصیف می‌کند، JobService منطق اجرا را شامل می‌شود. برنامه وظیفه را از طریق getSystemService(JobScheduler.class) ثبت می‌کند و schedule(jobInfo) را فراخوانی می‌کند. سیستم برنامه‌ریزی را بر عهده می‌گیرد.

JobService و JobInfo

JobService — یک کلاس انتزاعی است که از Service ارث می‌برد. دو روش کلیدی دارد: onStartJob (هنگام راه‌اندازی وظیفه فراخوانی می‌شود) و onStopJob (هنگام توقف اجباری توسط سیستم فراخوانی می‌شود). JobInfo از طریق Builder ایجاد می‌شود و تمام پارامترهای وظیفه را شامل می‌شود: شناسه، شرایط، محدودیت‌های زمانی.

java
public class SyncJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters params) {
        // اجرا در نخ اصلی
        Thread thread = new Thread(() -> {
            performSync();
            jobFinished(params, false);
        });
        thread.start();
        return true; // true = ادامه کار
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return true; // true = برنامه‌ریزی مجدد کار
    }
}

معیارهای راه‌اندازی وظیفه

JobScheduler امکان تعیین چندین معیار همزمان را فراهم می‌کند: نوع شبکه (NETWORK_TYPE_ANY, NOT_ROAMING, UNMETERED)، وضعیت شارژ (requiresCharging)، سطح شارژ (requiresBatteryNotLow)، وضعیت ذخیره‌سازی (requiresStorageNotLow) و حالت آماده‌باش (requiresDeviceIdle). وظیفه فقط زمانی راه‌اندازی می‌شود که تمام معیارها برآورده شوند.

پارامترهای JobInfo

JobInfo.Builder تنظیمات انعطاف‌پذیری برای هر وظیفه پس‌زمینه فراهم می‌کند. ترکیب صحیح پارامترها امکان ایجاد تعادل بین به‌موقع بودن اجرا و مصرف انرژی را فراهم می‌کند.

روشتوضیحاتمثال
setRequiredNetworkTypeنوع شبکه مورد نیازNETWORK_TYPE_UNMETERED
setRequiresChargingدستگاه در حال شارژtrue
setRequiresDeviceIdleدستگاه در حالت آماده‌باشtrue
setOverrideDeadlineحداکثر زمان انتظار (میلی‌ثانیه)300000
setMinimumLatencyحداقل تأخیر (میلی‌ثانیه)60000
setPeriodicاجرای دوره‌ای (میلی‌ثانیه)3600000
setBackoffCriteriaاستراتژی تکرار در صورت خرابیLINEAR / EXPONENTIAL

پارامتر مهم — setOverrideDeadline. اگر ددلاین تعیین کنید، سیستم تضمین می‌کند که وظیفه تا آن زمان راه‌اندازی شود، حتی اگر همه شرایط برآورده نشده باشند. این برای وظایفی با زمان اجرای بحرانی مفید است، مثلاً همگام‌سازی هر ۶ ساعت.

مثال استفاده از JobScheduler

برنامه‌ریزی وظیفه با چندین شرط

سناریوی معمول — همگام‌سازی داده‌ها هنگام اتصال به Wi-Fi و شارژ دستگاه. برنامه یک JobInfo با معیارهای مربوطه ایجاد کرده و آن را به JobScheduler ارسال می‌کند. سیستم وظیفه را هنگام فراهم شدن شرایط مطلوب راه‌اندازی می‌کند.

java
ComponentName serviceName = new ComponentName(this, SyncJobService.class);

JobInfo jobInfo = new JobInfo.Builder(JOB_ID_SYNC, serviceName)
    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
    .setRequiresCharging(true)
    .setRequiresBatteryNotLow(true)
    .setOverrideDeadline(6 * 60 * 60 * 1000) // ۶ ساعت
    .build();

JobScheduler scheduler = (JobScheduler)
    getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(jobInfo);

ثبت JobService در مانیفست

JobService باید در AndroidManifest.xml با مجوز BIND_JOB_SERVICE ثبت شود. در متد onStartJob مهم است که پس از اتمام کار jobFinished فراخوانی شود — در غیر این صورت سیستم تصور می‌کند وظیفه بی‌نهایت در حال اجراست و ممکن است آن را اجباری متوقف کند.

xml
<service
    android:name=".SyncJobService"
    android:permission="android.permission.BIND_JOB_SERVICE" />

محدودیت‌ها و جایگزین‌ها

JobScheduler دارای محدودیت‌هایی است. اولاً، فقط در Android 5+ در دسترس است — برای نسخه‌های قدیمی‌تر نیاز به جایگزین است. ثانیاً، سیستم ممکن است وظایف برنامه‌هایی را که به ندرت استفاده می‌شوند به تعویق بیندازد، به ویژه در Android 9+ با ویژگی App Standby Buckets. ثالثاً، JobScheduler مکانیزم راه‌اندازی مجدد تضمینی را در صورت خرابی فراهم نمی‌کند.

Google استفاده از WorkManager را به جای استفاده مستقیم از JobScheduler توصیه می‌کند. WorkManager در Android 5+ از JobScheduler در زیرساخت استفاده می‌کند، اما پشتیبانی از نسخه‌های قدیمی، تضمین اجرا، زنجیره وظایف و نظارت بر وضعیت از طریق LiveData را اضافه می‌کند. اگر برنامه فقط Android 8+ را پشتیبانی می‌کند و به منطق پیچیده وظایف پس‌زمینه نیاز ندارد، JobScheduler همچنان می‌تواند توجیه‌پذیر باشد.

نظارت و اشکال‌زدایی JobScheduler

برای اشکال‌زدایی JobScheduler از dumpsys jobscheduler از طریق ADB استفاده کنید: دستور تمام وظایف برنامه‌ریزی شده، وضعیت آنها، زمان باقی‌مانده و تاریخچه اجرا را نشان می‌دهد. برای برنامه خاص: adb shell dumpsys jobscheduler | grep نام_بسته. این امکان بررسی اینکه آیا وظیفه ثبت شده است، چه شرایطی تعیین شده و چرا راه‌اندازی نمی‌شود را فراهم می‌کند. همچنین JobScheduler.getPendingJob() برای بررسی برنامه‌ریزی وضعیت وظیفه در دسترس است. علاوه بر این، می‌توان از Android Studio Profiler برای تحلیل مصرف انرژی هنگام اجرای وظایف استفاده کرد. برای برنامه‌های Android 5+، JobScheduler ابزاری قابل اعتماد برای وظایف پس‌زمینه غیردقیق با شرایط شبکه و شارژ باقی می‌ماند.

JobScheduler در سناریوهای چندنخی

به طور پیش‌فرض JobService در نخ اصلی اجرا می‌شود، بنابراین تمام عملیات مسدودکننده نیاز به ایجاد نخ جداگانه یا استفاده از AsyncTask دارند. برخلاف WorkManager، JobScheduler استخر نخ داخلی ندارد. توسعه‌دهنده خودش نخ‌ها و همگام‌سازی را مدیریت می‌کند. استفاده از ThreadPoolExecutor برای وظایف موازی و Handler برای ارتباط با نخ اصلی توصیه می‌شود. در onStopJob مهم است که نخ‌های در حال کار به درستی متوقف شوند تا از نشت جلوگیری شود.

وظایف دوره‌ای از طریق JobScheduler

JobScheduler از وظایف دوره‌ای از طریق متد setPeriodic(long intervalMillis) پشتیبانی می‌کند. حداقل فاصله ۱۵ دقیقه است. با این حال، برخلاف WorkManager، JobScheduler رعایت دقیق فاصله را تضمین نمی‌کند — سیستم ممکن است اجرا را برای گروه‌بندی با سایر وظایف جابه‌جا کند. متد setPeriodic همچنین از flex-interval (پنجره انعطاف‌پذیر) که در نسخه‌های بعدی API ظاهر شد پشتیبانی نمی‌کند. برای اجرای دوره‌ای دقیق از AlarmManager در ترکیب با BroadcastReceiver استفاده کنید.

App Standby Buckets و تأثیر بر JobScheduler

از Android 9، Google App Standby Buckets را معرفی کرد که برنامه‌ها را بر اساس دفعات استفاده طبقه‌بندی می‌کند: Active, Working Set, Frequent, Rare. برنامه‌های در دسته Rare تأخیر تا ۲۴ ساعت در اجرای وظایف JobScheduler می‌بینند. توسعه‌دهندگان فقط از طریق کیفیت برنامه می‌توانند بر دسته تأثیر بگذارند — مکانیزم‌های سیستمی به طور خودکار اولویت برنامه‌هایی را که کاربر به طور منظم با آنها تعامل دارد افزایش می‌دهد. JobScheduler این طبقه‌بندی را در نظر می‌گیرد و وظیفه برنامه Rare فقط در پنجره سرویس اجرا می‌شود. برای برنامه‌های دسته Active (پراستفاده‌ترین) تأخیرها حداقل است و وظایف عملاً بلافاصله پس از برآورده شدن شرایط اجرا می‌شوند.

برای وظایف دوره‌ای با زمان دقیق راه‌اندازی، JobScheduler مناسب نیست — از AlarmManager استفاده کنید. برای وظایف کوتاه یکباره — Foreground Service با اعلان. JobScheduler برای وظایفی که بازدهی انرژی مهم است نه دقت زمان، بهینه است: همگام‌سازی، بارگیری به‌روزرسانی‌ها، پردازش دسته‌ای داده‌ها. انتخاب صحیح ابزار کار پس‌زمینه مستقیماً بر تجربه کاربری و عمر باتری دستگاه تأثیر می‌گذارد. تصمیم نهایی — JobScheduler برای پردازش دسته‌ای با شرایط، AlarmManager برای وظایف زمان‌بندی شده، WorkManager به عنوان زمان‌بند جهانی.

سؤالات متداول

آیا درست است که JobScheduler وظایف برنامه‌های مختلف را ترکیب می‌کند؟

بله، JobScheduler وظایف برنامه‌های مختلف را در بسته‌هایی گروه‌بندی کرده و آنها را با هم اجرا می‌کند. این مزیت کلیدی نسبت به AlarmManager است: به جای اینکه هر برنامه به طور جداگانه دستگاه را بیدار کند، سیستم پردازنده را یک بار بیدار کرده و تمام وظایف برنامه‌ریزی شده را پردازش می‌کند.

اگر وظیفه در JobService بیش از حد طولانی اجرا شود چه اتفاقی می‌افتد؟

اگر فراخوانی jobFinished در مدت زمان معقول انجام نشود، سیستم می‌تواند به طور اجباری onStopJob را فراخوانی کرده و وظیفه را پایان دهد. توصیه می‌شود برای یک وظیفه در عرض چند دقیقه به اتمام برسانید و پس از اتمام همیشه jobFinished را فراخوانی کنید.

JobScheduler در Doze Mode چگونه رفتار می‌کند؟

در Doze Mode، JobScheduler تمام وظایف را تا پنجره سرویس بعدی (maintenance window) که دوره‌ای می‌آید به تعویق می‌اندازد. استفاده از setOverrideDeadline تضمین می‌کند که وظیفه با در نظر گرفتن این پنجره‌ها اجرا شود، اما نه لزوماً در زمان دقیق.

تفاوت JobScheduler با WorkManager چیست؟

WorkManager — کتابخانه‌ای است که در Android 5+ از JobScheduler در زیرساخت استفاده می‌کند. WorkManager تضمین اجرا، پشتیبانی از نسخه‌های قدیمی (API 14+)، زنجیره Workerها، نظارت بر وضعیت از طریق LiveData/Flow و تکرار خودکار در صورت خرابی را اضافه می‌کند.

چگونه یک وظیفه برنامه‌ریزی شده در JobScheduler را لغو کنیم؟

برای لغو از scheduler.cancel(JOB_ID) برای وظیفه خاص یا scheduler.cancelAll() برای تمام وظایف برنامه استفاده کنید. اطمینان حاصل کنید که Job ID با مشخص شده در زمان ایجاد JobInfo مطابقت دارد، در غیر این صورت وظیفه لغو نخواهد شد.

برای توسعه‌دهندگان مهم است که درک کنند JobScheduler یک API سیستمی سطح پایین است که برای تیم‌های باتجربه که می‌خواهند کنترل کامل بر وظایف پس‌زمینه دستگاه داشته باشند طراحی شده است. برای اکثر برنامه‌ها، WorkManager همان قابلیت را با API ساده‌تر، امن‌تر و مدرن‌تر برای Android فراهم می‌کند.

خلاصه

  • JobScheduler — سرویس سیستمی Android 5+ برای اجرای دسته‌ای وظایف پس‌زمینه با شرایط مشخص است.
  • معماری حول JobService (منطق) و JobInfo (پارامترها) ساخته شده است که از طریق AndroidManifest ثبت می‌شوند.
  • معیارهای راه‌اندازی شامل شبکه، شارژ، وضعیت ذخیره‌سازی و بیکار بودن دستگاه است.
  • setOverrideDeadline — تنها راه تضمین اجرای وظیفه تا زمان مشخص.
  • اجرای دسته‌ای وظایف برنامه‌های مختلف را ترکیب کرده و مصرف کلی انرژی دستگاه را کاهش می‌دهد.
  • WorkManager — جایگزین ترجیحی با تضمین اجرا و پشتیبانی از نسخه‌های قدیمی Android.
  • استفاده نکنید از JobScheduler برای وظایف با زمان دقیق — برای این کار AlarmManager مناسب است.

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

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

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

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