งานที่คงอยู่   ส่วนหนึ่งของ Android Jetpack

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

ประเภทของงานที่คงอยู่

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

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

รูปที่ 1 แสดงให้เห็นว่างานถาวรประเภทต่างๆ เกี่ยวข้องกันอย่างไร

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

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

ประเภท ความถี่ วิธีเข้าถึง
ทันที ครั้งเดียว OneTimeWorkRequest และWorker หากต้องการให้ดำเนินการอย่างรวดเร็ว โปรดโทรหา setExpedited() ใน OneTimeWorkRequest
ทำงานเป็นเวลานาน ครั้งเดียวหรือเป็นระยะ WorkRequest หรือ Worker ก็ได้ เรียกใช้ setForeground() ใน Worker เพื่อจัดการการแจ้งเตือน
เลื่อนได้ ครั้งเดียวหรือเป็นระยะ PeriodicWorkRequest และWorker

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

ฟีเจอร์ของ WorkManager

นอกจากจะมอบ 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 อื่นๆ

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

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

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

WorkManager API เป็น API ที่แนะนำให้ใช้แทนที่ Android background scheduling API รุ่นก่อนหน้า ซึ่งรวมถึง FirebaseJobDispatcher และ GcmNetworkManager

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

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

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

ส่วนต่อไปนี้มีแหล่งข้อมูลเพิ่มเติม

วิดีโอ

บล็อก

ตัวอย่าง