งานที่คงอยู่ ส่วนหนึ่งของ Android Jetpack
งานจะยังคงอยู่เมื่อมีการกำหนดเวลาผ่านการรีสตาร์ทแอปและการรีบูตระบบ WorkManager เป็นโซลูชันที่แนะนำสำหรับงานที่ต้องดำเนินการอย่างต่อเนื่อง เนื่องจากการประมวลผลในเบื้องหลังส่วนใหญ่ควรทำผ่านงานที่ต่อเนื่อง WorkManager จึงเป็น API หลักที่แนะนำสำหรับการประมวลผลในเบื้องหลังโดยทั่วไปด้วย
ประเภทของงานที่คงอยู่
WorkManager จัดการงานที่คงอยู่ 3 ประเภท ได้แก่
- ด่วน: งานที่ต้องเริ่มทันทีและทำให้เสร็จในเร็วๆ นี้ อาจ เร่งดำเนินการได้
- ใช้เวลานาน: งานที่อาจใช้เวลานานกว่า 10 นาที
- เลื่อนได้: งานที่ตั้งเวลาไว้ซึ่งจะเริ่มในภายหลังและสามารถเรียกใช้ เป็นระยะๆ
รูปที่ 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 ในแอป
แหล่งข้อมูลเพิ่มเติม
ส่วนต่อไปนี้มีแหล่งข้อมูลเพิ่มเติม
วิดีโอ
- Workmanager - ทักษะ MAD, วิดีโอชุด
- การทำงานกับ WorkManager จาก Android Dev Summit ปี 2018
- WorkManager: Beyond the basics จาก Android Dev Summit ปี 2019