ตั้งเวลางานด้วย WorkManager   เป็นส่วนหนึ่งของ Android Jetpack

WorkManager เป็นโซลูชันที่แนะนำสำหรับงานที่ทำงานอยู่เสมอ งานจะยังคงอยู่เมื่อมีการกําหนดเวลาไว้ผ่านการรีสตาร์ทแอปและการรีบูตระบบ เนื่องจากการประมวลผลเบื้องหลังส่วนใหญ่จะทําได้ดีที่สุดผ่านงานที่ทำงานอยู่อย่างต่อเนื่อง WorkManager จึงถือเป็น API หลักที่แนะนําสําหรับการประมวลผลเบื้องหลัง

ประเภทของงานที่เก็บไว้ถาวร

WorkManager จัดการงานที่ทำงานอยู่อย่างต่อเนื่อง 3 ประเภท ได้แก่

  • ทันที: งานที่ต้องทำทันทีและเสร็จสิ้นในไม่ช้า อาจเร่งดำเนินการ
  • ทำงานนาน: งานที่อาจทำงานนานขึ้น ซึ่งอาจนานกว่า 10 นาที
  • เลื่อนได้: งานที่ตั้งเวลาไว้ซึ่งจะเริ่มทำงานในภายหลังและสามารถทำงานเป็นระยะๆ ได้

รูปที่ 1 แสดงความสัมพันธ์ของงานถาวรประเภทต่างๆ

งานแบบถาวรอาจเป็นแบบทันที แบบทำงานต่อเนื่อง หรือแบบเลื่อนได้
รูปที่ 1: ประเภทของงานที่เก็บไว้ถาวร

ในทํานองเดียวกัน ตารางต่อไปนี้จะแสดงงานประเภทต่างๆ

ประเภท ความถี่ วิธีเข้าถึง
ทันที ครั้งเดียว OneTimeWorkRequest และWorker

หากต้องการงานด่วน โปรดโทรหา setExpedited() ใน OneTimeWorkRequest

ทำงานเป็นเวลานาน แบบครั้งเดียวหรือเป็นระยะ WorkRequest หรือ Worker ก็ได้ โทรหา setForeground() ใน Worker เพื่อจัดการการแจ้งเตือน
เลื่อนได้ แบบครั้งเดียวหรือเป็นระยะ PeriodicWorkRequest และWorker

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีตั้งค่า WorkManager ได้ในคู่มือการกำหนด WorkRequest

ฟีเจอร์

นอกจาก API ที่เรียบง่ายและสม่ำเสมอมากขึ้นแล้ว WorkManager ยังมีข้อดีที่สำคัญอื่นๆ อีกมากมาย ดังนี้

ข้อจำกัดของงาน

กําหนดเงื่อนไขที่เหมาะสมที่สุดเพื่อให้งานทํางานโดยใช้ข้อจํากัดของงาน เช่น ทำงานเฉพาะเมื่ออุปกรณ์อยู่ในเครือข่ายที่ไม่จำกัดปริมาณการใช้งาน เมื่ออุปกรณ์ไม่มีการใช้งาน หรือเมื่อแบตเตอรี่เพียงพอ

การกำหนดเวลาที่มีประสิทธิภาพ

WorkManager ช่วยให้คุณกำหนดเวลางานให้ทำงานแบบครั้งเดียวหรือซ้ำๆได้โดยใช้กรอบเวลาที่กำหนดเวลาได้ยืดหยุ่น คุณยังติดแท็กและตั้งชื่องานได้ด้วย ซึ่งจะช่วยให้คุณกำหนดเวลางานที่ไม่ซ้ำกันซึ่งสามารถแทนที่กันได้ รวมถึงตรวจสอบหรือยกเลิกกลุ่มงานพร้อมกันได้

งานที่ตั้งเวลาไว้จะจัดเก็บไว้ในฐานข้อมูล SQLite ที่จัดการภายใน และ WorkManager จะดูแลให้งานนี้ยังคงอยู่และกำหนดเวลาใหม่เมื่ออุปกรณ์รีบูต

นอกจากนี้ WorkManager ยังใช้ฟีเจอร์และแนวทางปฏิบัติแนะนำสำหรับการประหยัดพลังงาน เช่น โหมดสลีป คุณจึงไม่ต้องกังวล

งานด่วน

คุณสามารถใช้ WorkManager เพื่อกำหนดเวลางานให้ทำงานทันทีในเบื้องหลังได้ คุณควรใช้การทํางานแบบเร่งด่วนกับงานที่สําคัญต่อผู้ใช้และทําเสร็จภายในไม่กี่นาที

นโยบายการลองใหม่แบบยืดหยุ่น

บางครั้งงานก็ดำเนินการไม่สำเร็จ WorkManager มีนโยบายการลองใหม่แบบยืดหยุ่น ซึ่งรวมถึงนโยบายการถดถอยแบบเลขชี้กำลังที่กำหนดค่าได้

การเชื่อมโยงงาน

สำหรับงานที่ซับซ้อนที่เกี่ยวข้อง ให้เชื่อมโยงงานแต่ละรายการเข้าด้วยกันโดยใช้อินเทอร์เฟซที่ใช้งานง่ายซึ่งช่วยให้คุณควบคุมได้ว่าจะให้งานใดทำงานตามลำดับและงานใดทำงานพร้อมกัน

Kotlin


val continuation = WorkManager.getInstance(context)
    .beginUniqueWork(
        Constants.IMAGE_MANIPULATION_WORK_NAME,
        ExistingWorkPolicy.REPLACE,
        OneTimeWorkRequest.from(CleanupWorker::class.java)
    ).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java))
    .then(
        if (save) {
            workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT)
        } else /* upload */ {
            workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT)
        }
    )

Java


WorkManager.getInstance(...)
.beginWith(Arrays.asList(workA, workB))
.then(workC)
.enqueue();

คุณสามารถกำหนดข้อมูลอินพุตและเอาต์พุตสำหรับงานแต่ละรายการ เมื่อใช้การต่องานเข้าด้วยกัน WorkManager จะส่งข้อมูลเอาต์พุตจากงานงานหนึ่งไปยังงานถัดไปโดยอัตโนมัติ

ความสามารถในการทำงานร่วมกันของชุดข้อความในตัว

WorkManager ผสานรวมได้อย่างราบรื่นกับ Coroutines และ RxJava และยังมีความยืดหยุ่นในการเสียบ API แบบแอซิงโครนัสของคุณเอง

ใช้ WorkManager เพื่อการทำงานที่เชื่อถือได้

WorkManager มีไว้สำหรับงานที่จำเป็นต้องทำงานอย่างน่าเชื่อถือ แม้ว่าผู้ใช้จะออกจากหน้าจอ แอปจะออก หรืออุปกรณ์จะรีสตาร์ท เช่น

  • การส่งบันทึกหรือข้อมูลวิเคราะห์ไปยังบริการแบ็กเอนด์
  • การซิงค์ข้อมูลแอปพลิเคชันกับเซิร์ฟเวอร์เป็นระยะๆ

WorkManager ไม่ได้มีไว้สำหรับงานเบื้องหลังที่อยู่ระหว่างดำเนินการซึ่งสามารถสิ้นสุดได้อย่างปลอดภัยหากกระบวนการของแอปหยุดทำงาน และไม่ใช่โซลูชันทั่วไปสำหรับงานทั้งหมดที่ต้องดำเนินการทันที โปรดอ่านคู่มือการประมวลผลในเบื้องหลังเพื่อดูว่าโซลูชันใดที่ตรงกับความต้องการของคุณ

ความสัมพันธ์กับ API อื่นๆ

แม้ว่าโคโริวทีนจะเป็นโซลูชันที่แนะนำสำหรับบางกรณีการใช้งาน แต่คุณไม่ควรใช้โคโริวทีนสำหรับงานที่ทำงานอยู่อย่างต่อเนื่อง โปรดทราบว่า โคโริวทีนเป็นเฟรมเวิร์กการทำงานพร้อมกัน ส่วน WorkManager เป็นไลบรารีสำหรับงานที่ทำงานอยู่เสมอ ในทํานองเดียวกัน คุณควรใช้ AlarmManager สําหรับนาฬิกาหรือปฏิทินเท่านั้น

API แนะนำสำหรับ ความสัมพันธ์กับ WorkManager
Coroutines งานแบบไม่พร้อมกันทั้งหมดที่ไม่จําเป็นต้องคงอยู่ โคโริวทีนเป็นวิธีมาตรฐานในการออกจากเธรดหลักใน Kotlin อย่างไรก็ตาม ข้อมูลดังกล่าวจะออกจากหน่วยความจำเมื่อแอปปิด สำหรับงานที่ทำงานอยู่ตลอด ให้ใช้ WorkManager
AlarmManager เฉพาะปลุกเท่านั้น AlarmManager จะปลุกอุปกรณ์จากโหมด Doze ซึ่งแตกต่างจาก WorkManager ดังนั้นจึงใช้พลังงานและจัดการทรัพยากรอย่างไม่มีประสิทธิภาพ ใช้เฉพาะสำหรับการปลุกหรือการแจ้งเตือนที่แม่นยำ เช่น กิจกรรมในปฏิทิน ไม่ใช่งานเบื้องหลัง

การเปลี่ยน API ที่เลิกใช้งานแล้ว

เราขอแนะนําให้ใช้ WorkManager API แทน API การจัดกําหนดเวลาเบื้องหลังทั้งหมดของ Android เวอร์ชันเก่า ซึ่งรวมถึง FirebaseJobDispatcher, GcmNetworkManager และ Job Scheduler

เริ่มต้นใช้งาน

ดูคู่มือเริ่มต้นใช้งานเพื่อเริ่มใช้ WorkManager ในแอป

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับ WorkManager ได้ที่แหล่งข้อมูลต่อไปนี้

ตัวอย่าง

วิดีโอ

บล็อก