การกำหนดเวลางาน

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

ประเภทผลงาน

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 อื่นๆ

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

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

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

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

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

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

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

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

วิดีโอ

บล็อก

ตัวอย่าง