JobScheduler — سرویس سیستمی Android است که در API 21 (Android 5.0 Lollipop) معرفی شد و به برنامهها اجازه میدهد اجرای وظایف پسزمینه را بر اساس شرایط مشخصی برنامهریزی کنند. برخلاف AlarmManager، JobScheduler به زمان دقیق راهاندازی نیاز ندارد — سیستم خود لحظه بهینه را با ترکیب نیازهای برنامه با وضعیت فعلی دستگاه تعیین میکند. به گفته Android Developers, 2026، این سرویس از معیارهای شبکه، شارژ، وضعیت ذخیرهسازی و بیکار بودن دستگاه پشتیبانی میکند.
نکات اصلی
JobScheduler — سرویس سیستمی Android است که چندین وظیفه پسزمینه را در بستههایی برای کاهش مصرف انرژی ترکیب میکند. به جای اینکه هر برنامه به طور جداگانه دستگاه را بیدار کند، JobScheduler آنها را گروهبندی کرده و در لحظه بهینه، زمانی که دستگاه در حال حاضر فعال است، اجرا میکند. این کار عمر باتری را به طور قابل توجهی افزایش میدهد.
قبل از ظهور JobScheduler، توسعهدهندگان از AlarmManager و BroadcastReceiver برای وظایف پسزمینه استفاده میکردند. مشکل این رویکرد — هر برنامه به طور مستقل دستگاه را بیدار میکرد که منجر به تخلیه سریع باتری میشد. JobScheduler این مشکل را با معرفی پنجره اجرای دستهای حل کرد که در آن سیستم تمام وظایف برنامهریزی شده برنامههای مختلف را همزمان راهاندازی میکند.
اصل کار بر اساس شی JobInfo است که برنامه به JobScheduler ارسال میکند. سیستم وظیفه را ذخیره میکند و زمانی که تمام شرایط مشخص شده برآورده شوند، آن را راهاندازی میکند. برخلاف WorkManager، JobScheduler راهاندازی مجدد را در صورت خرابی تضمین نمیکند — اگر وظیفه با استثنا شکست بخورد، توسعهدهنده باید خودش دوباره آن را برنامهریزی کند.
JobScheduler از معماری مبتنی بر JobService و JobInfo استفاده میکند. JobInfo وظیفه و شرایط آن را توصیف میکند، JobService منطق اجرا را شامل میشود. برنامه وظیفه را از طریق getSystemService(JobScheduler.class) ثبت میکند و schedule(jobInfo) را فراخوانی میکند. سیستم برنامهریزی را بر عهده میگیرد.
JobService — یک کلاس انتزاعی است که از Service ارث میبرد. دو روش کلیدی دارد: onStartJob (هنگام راهاندازی وظیفه فراخوانی میشود) و onStopJob (هنگام توقف اجباری توسط سیستم فراخوانی میشود). JobInfo از طریق Builder ایجاد میشود و تمام پارامترهای وظیفه را شامل میشود: شناسه، شرایط، محدودیتهای زمانی.
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.Builder تنظیمات انعطافپذیری برای هر وظیفه پسزمینه فراهم میکند. ترکیب صحیح پارامترها امکان ایجاد تعادل بین بهموقع بودن اجرا و مصرف انرژی را فراهم میکند.
| روش | توضیحات | مثال |
|---|---|---|
| setRequiredNetworkType | نوع شبکه مورد نیاز | NETWORK_TYPE_UNMETERED |
| setRequiresCharging | دستگاه در حال شارژ | true |
| setRequiresDeviceIdle | دستگاه در حالت آمادهباش | true |
| setOverrideDeadline | حداکثر زمان انتظار (میلیثانیه) | 300000 |
| setMinimumLatency | حداقل تأخیر (میلیثانیه) | 60000 |
| setPeriodic | اجرای دورهای (میلیثانیه) | 3600000 |
| setBackoffCriteria | استراتژی تکرار در صورت خرابی | LINEAR / EXPONENTIAL |
پارامتر مهم — setOverrideDeadline. اگر ددلاین تعیین کنید، سیستم تضمین میکند که وظیفه تا آن زمان راهاندازی شود، حتی اگر همه شرایط برآورده نشده باشند. این برای وظایفی با زمان اجرای بحرانی مفید است، مثلاً همگامسازی هر ۶ ساعت.
سناریوی معمول — همگامسازی دادهها هنگام اتصال به Wi-Fi و شارژ دستگاه. برنامه یک JobInfo با معیارهای مربوطه ایجاد کرده و آن را به JobScheduler ارسال میکند. سیستم وظیفه را هنگام فراهم شدن شرایط مطلوب راهاندازی میکند.
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 باید در AndroidManifest.xml با مجوز BIND_JOB_SERVICE ثبت شود. در متد onStartJob مهم است که پس از اتمام کار jobFinished فراخوانی شود — در غیر این صورت سیستم تصور میکند وظیفه بینهایت در حال اجراست و ممکن است آن را اجباری متوقف کند.
<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 از dumpsys jobscheduler از طریق ADB استفاده کنید: دستور تمام وظایف برنامهریزی شده، وضعیت آنها، زمان باقیمانده و تاریخچه اجرا را نشان میدهد. برای برنامه خاص: adb shell dumpsys jobscheduler | grep نام_بسته. این امکان بررسی اینکه آیا وظیفه ثبت شده است، چه شرایطی تعیین شده و چرا راهاندازی نمیشود را فراهم میکند. همچنین JobScheduler.getPendingJob() برای بررسی برنامهریزی وضعیت وظیفه در دسترس است. علاوه بر این، میتوان از Android Studio Profiler برای تحلیل مصرف انرژی هنگام اجرای وظایف استفاده کرد. برای برنامههای Android 5+، JobScheduler ابزاری قابل اعتماد برای وظایف پسزمینه غیردقیق با شرایط شبکه و شارژ باقی میماند.
به طور پیشفرض JobService در نخ اصلی اجرا میشود، بنابراین تمام عملیات مسدودکننده نیاز به ایجاد نخ جداگانه یا استفاده از AsyncTask دارند. برخلاف WorkManager، JobScheduler استخر نخ داخلی ندارد. توسعهدهنده خودش نخها و همگامسازی را مدیریت میکند. استفاده از ThreadPoolExecutor برای وظایف موازی و Handler برای ارتباط با نخ اصلی توصیه میشود. در onStopJob مهم است که نخهای در حال کار به درستی متوقف شوند تا از نشت جلوگیری شود.
JobScheduler از وظایف دورهای از طریق متد setPeriodic(long intervalMillis) پشتیبانی میکند. حداقل فاصله ۱۵ دقیقه است. با این حال، برخلاف WorkManager، JobScheduler رعایت دقیق فاصله را تضمین نمیکند — سیستم ممکن است اجرا را برای گروهبندی با سایر وظایف جابهجا کند. متد setPeriodic همچنین از flex-interval (پنجره انعطافپذیر) که در نسخههای بعدی API ظاهر شد پشتیبانی نمیکند. برای اجرای دورهای دقیق از AlarmManager در ترکیب با BroadcastReceiver استفاده کنید.
از 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 وظایف برنامههای مختلف را در بستههایی گروهبندی کرده و آنها را با هم اجرا میکند. این مزیت کلیدی نسبت به AlarmManager است: به جای اینکه هر برنامه به طور جداگانه دستگاه را بیدار کند، سیستم پردازنده را یک بار بیدار کرده و تمام وظایف برنامهریزی شده را پردازش میکند.
اگر فراخوانی jobFinished در مدت زمان معقول انجام نشود، سیستم میتواند به طور اجباری onStopJob را فراخوانی کرده و وظیفه را پایان دهد. توصیه میشود برای یک وظیفه در عرض چند دقیقه به اتمام برسانید و پس از اتمام همیشه jobFinished را فراخوانی کنید.
در Doze Mode، JobScheduler تمام وظایف را تا پنجره سرویس بعدی (maintenance window) که دورهای میآید به تعویق میاندازد. استفاده از setOverrideDeadline تضمین میکند که وظیفه با در نظر گرفتن این پنجرهها اجرا شود، اما نه لزوماً در زمان دقیق.
WorkManager — کتابخانهای است که در Android 5+ از JobScheduler در زیرساخت استفاده میکند. WorkManager تضمین اجرا، پشتیبانی از نسخههای قدیمی (API 14+)، زنجیره Workerها، نظارت بر وضعیت از طریق LiveData/Flow و تکرار خودکار در صورت خرابی را اضافه میکند.
برای لغو از scheduler.cancel(JOB_ID) برای وظیفه خاص یا scheduler.cancelAll() برای تمام وظایف برنامه استفاده کنید. اطمینان حاصل کنید که Job ID با مشخص شده در زمان ایجاد JobInfo مطابقت دارد، در غیر این صورت وظیفه لغو نخواهد شد.
برای توسعهدهندگان مهم است که درک کنند JobScheduler یک API سیستمی سطح پایین است که برای تیمهای باتجربه که میخواهند کنترل کامل بر وظایف پسزمینه دستگاه داشته باشند طراحی شده است. برای اکثر برنامهها، WorkManager همان قابلیت را با API سادهتر، امنتر و مدرنتر برای Android فراهم میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید