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 | เวลารอสูงสุด (ms) | 300000 |
| setMinimumLatency | ความล่าช้าขั้นต่ำ (ms) | 60000 |
| setPeriodic | การทำงานเป็นระยะ (ms) | 3600000 |
| setBackoffCriteria | กลยุทธ์การลองใหม่เมื่อล้มเหลว | LINEAR / EXPONENTIAL |
พารามิเตอร์ที่สำคัญคือ setOverrideDeadline หากระบุกำหนดเวลา ระบบรับประกันว่างานจะทำงานภายในเวลานั้น แม้ว่าจะไม่ตรงตามเงื่อนไขทั้งหมดก็ตาม ซึ่งมีประโยชน์สำหรับงานที่สำคัญด้านเวลา เช่น การซิงค์ทุก 6 ชั่วโมง
สถานการณ์ทั่วไป คือการซิงค์ข้อมูลเมื่อเชื่อมต่อ 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) // 6 ชั่วโมง
.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 ใช้ JobScheduler ภายในบน Android 5+ แต่เพิ่มการรองรับเวอร์ชันเก่า การรับประกันการทำงาน ลูกโซ่งาน และการสังเกตสถานะผ่าน LiveData หากแอปของคุณรองรับเฉพาะ Android 8+ และไม่ต้องการตรรกะงานเบื้องหลังที่ซับซ้อน JobScheduler ยังคงเป็นตัวเลือกที่สมเหตุสมผล
ในการดีบัก JobScheduler ให้ใช้ dumpsys jobscheduler ผ่าน ADB: คำสั่งแสดงงานที่กำหนดเวลาทั้งหมด สถานะ เวลาที่เหลือ และประวัติการทำงาน สำหรับแอปเฉพาะ: adb shell dumpsys jobscheduler | grep package_name ซึ่งช่วยให้คุณตรวจสอบว่างานได้ลงทะเบียนแล้ว เงื่อนไขใดถูกตั้งไว้ และเหตุใดจึงไม่ทำงาน คุณยังสามารถใช้ JobScheduler.getPendingJob() เพื่อตรวจสอบสถานะงานโดยทางโปรแกรม นอกจากนี้ Android Studio Profiler สามารถใช้วิเคราะห์การใช้พลังงานระหว่างการทำงานของงาน สำหรับแอปบน Android 5+ JobScheduler ยังคงเป็นเครื่องมือที่เชื่อถือได้สำหรับงานเบื้องหลังที่ไม่แม่นยำพร้อมเงื่อนไขเครือข่ายและการชาร์จ
โดยค่าเริ่มต้น JobService ทำงานบนเธรดหลัก ดังนั้นการดำเนินการที่บล็อกทั้งหมดจำเป็นต้องสร้างเธรดแยกหรือใช้ AsyncTask แตกต่างจาก WorkManager ตรงที่ JobScheduler ไม่มีพูลเธรดในตัว นักพัฒนาจัดการเธรดและการซิงค์อย่างอิสระ ขอแนะนำให้ใช้ ThreadPoolExecutor สำหรับงานแบบขนานและ Handler สำหรับการสื่อสารกับเธรดหลัก ใน onStopJob สิ่งสำคัญคือต้องขัดจังหวะเธรดที่ทำงานอยู่อย่างถูกต้องเพื่อป้องกันการรั่วไหล
JobScheduler รองรับงานเป็นระยะผ่านเมธอด setPeriodic(long intervalMillis) ช่วงเวลาขั้นต่ำคือ 15 นาที อย่างไรก็ตาม แตกต่างจาก WorkManager JobScheduler ไม่รับประกันการปฏิบัติตามช่วงเวลาที่แน่นอน — ระบบอาจเลื่อนการทำงานเพื่อรวมเป็นชุดกับงานอื่น ๆ เมธอด setPeriodic ยังไม่รองรับช่วงเวลาที่ยืดหยุ่น (หน้าต่างยืดหยุ่น) ซึ่งปรากฏใน API เวอร์ชันหลัง สำหรับการทำงานเป็นระยะที่แม่นยำ ให้ใช้ AlarmManager ร่วมกับ BroadcastReceiver
ตั้งแต่ Android 9 เป็นต้นไป Google ได้แนะนำ App Standby Buckets ซึ่งจัดหมวดหมู่แอปตามความถี่ในการใช้งาน: Active, Working Set, Frequent, Rare แอปในหมวด Rare จะพบความล่าช้าในการทำงานของ JobScheduler สูงถึง 24 ชั่วโมง นักพัฒนาสามารถมีอิทธิพลต่อหมวดหมู่ได้ผ่านคุณภาพของแอปเท่านั้น — กลไกระบบจะเพิ่มลำดับความสำคัญของแอปที่ผู้ใช้โต้ตอบเป็นประจำโดยอัตโนมัติ JobScheduler พิจารณาการจัดหมวดหมู่นี้ และงานจากแอป Rare จะทำงานเฉพาะในหน้าต่างบำรุงรักษาเท่านั้น สำหรับแอปในหมวด Active (ที่ใช้บ่อยที่สุด) ความล่าช้าน้อยมาก และงานจะทำงานเกือบจะทันทีเมื่อตรงตามเงื่อนไข
สำหรับงานเป็นระยะที่มีเวลาแน่นอน JobScheduler ไม่เหมาะสม — ใช้ AlarmManager แทน สำหรับงานสั้นครั้งเดียว — Foreground Service พร้อมการแจ้งเตือน JobScheduler เหมาะสมที่สุดสำหรับงานที่ประสิทธิภาพการใช้พลังงานสำคัญกว่าความแม่นยำของเวลา: การซิงค์ การดาวน์โหลดอัปเดต การประมวลผลข้อมูลเป็นชุด การเลือกเครื่องมือทำงานเบื้องหลังที่ถูกต้องส่งผลโดยตรงต่อประสบการณ์ผู้ใช้และอายุแบตเตอรี่ของอุปกรณ์ สรุป: ใช้ JobScheduler สำหรับการประมวลผลเป็นชุดพร้อมเงื่อนไข AlarmManager สำหรับงานตามกำหนดเวลา และ WorkManager เป็นตัวกำหนดเวลาสากล
คำถามที่พบบ่อย
ใช่ JobScheduler จัดกลุ่มงานจากแอปต่าง ๆ เป็นชุดและทำงานร่วมกัน นี่คือข้อได้เปรียบหลักเหนือ AlarmManager: แทนที่แต่ละแอปจะปลุกอุปกรณ์แยกกัน ระบบจะปลุกโปรเซสเซอร์ครั้งเดียวและประมวลผลงานที่กำหนดเวลาทั้งหมด
หากไม่ได้เรียก jobFinished ภายในเวลาที่เหมาะสม ระบบอาจเรียก onStopJob แบบบังคับและยุติงาน ขอแนะนำให้ทำงานเดียวให้เสร็จภายในไม่กี่นาทีและเรียก jobFinished ทุกครั้งเมื่อเสร็จสิ้น
ใน Doze Mode JobScheduler จะเลื่อนงานทั้งหมดออกไปจนถึงหน้าต่างบำรุงรักษาครั้งถัดไป ซึ่งเกิดขึ้นเป็นระยะ การใช้ setOverrideDeadline รับประกันว่างานจะทำงานโดยพิจารณาหน้าต่างเหล่านี้ แต่ไม่จำเป็นต้องเป็นเวลาที่แน่นอน
WorkManager คือไลบรารีที่ใช้ JobScheduler ภายในบน Android 5+ WorkManager เพิ่มการรับประกันการทำงาน การรองรับเวอร์ชันเก่า (API 14+) ลูกโซ่ Worker การสังเกตสถานะผ่าน LiveData/Flow และการลองใหม่โดยอัตโนมัติเมื่อล้มเหลว
ในการยกเลิก ใช้ scheduler.cancel(JOB_ID) สำหรับงานเฉพาะ หรือ scheduler.cancelAll() สำหรับงานทั้งหมดของแอป ตรวจสอบให้แน่ใจว่า ID งานตรงกับที่ระบุเมื่อสร้าง JobInfo มิฉะนั้นงานจะไม่ถูกยกเลิก
นักพัฒนาควรเข้าใจว่า JobScheduler เป็น API ระบบระดับต่ำที่ออกแบบมาสำหรับทีมที่มีประสบการณ์ซึ่งต้องการควบคุมงานเบื้องหลังบนอุปกรณ์อย่างเต็มที่ สำหรับแอปพลิเคชันส่วนใหญ่ WorkManager มีฟังก์ชันการทำงานเดียวกันกับ API ที่ง่ายกว่า ปลอดภัยกว่า และทันสมัยกว่าสำหรับ Android
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ