ภาพรวมของงานในเบื้องหลัง

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

เอกสารนี้จะอธิบายตัวเลือกต่างๆ ที่คุณใช้ได้ และช่วยคุณเลือกตัวเลือกที่เหมาะกับสถานการณ์ของคุณ

คำศัพท์

คําสําคัญบางคําที่เกี่ยวข้องกับงานเบื้องหลังอาจใช้หลายวิธีซึ่งขัดแย้งกัน ด้วยเหตุนี้ เราจึงต้องกําหนดคําศัพท์

หากแอปทำงานอยู่เบื้องหลัง ระบบจะจำกัดแอปนั้นๆ (เช่น ในกรณีส่วนใหญ่ แอปที่ทำงานอยู่เบื้องหลังจะเปิดบริการที่ทำงานอยู่เบื้องหน้าไม่ได้)

ในเอกสารนี้ เราจะใช้คำว่า "งาน" เพื่อหมายถึงการดำเนินการที่แอปทำนอกเวิร์กโฟลว์หลัก เพื่อความสอดคล้องกันในด้านความเข้าใจ เราจึงจัดประเภทงานออกเป็น 3 หมวดหมู่หลัก ได้แก่ การทำงานแบบไม่พร้อมกัน, API การจัดตารางงาน และบริการที่ทำงานอยู่เบื้องหน้า

เลือกตัวเลือกที่เหมาะสม

ในสถานการณ์ส่วนใหญ่ คุณสามารถหา API ที่เหมาะกับงานของคุณได้โดยดูหมวดหมู่ (การทำงานแบบไม่สอดคล้อง, API การจัดตารางงาน หรือบริการที่ทำงานอยู่เบื้องหน้า) ที่งานนั้นจัดอยู่

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

สถานการณ์หลัก 2 ประการที่ควรพิจารณาสำหรับงานเบื้องหลังมีดังนี้

สถานการณ์ทั้ง 2 นี้จะมีแผนภูมิการตัดสินใจเป็นของตัวเอง

งานแบบไม่พร้อมกัน

ในหลายกรณี แอปเพียงต้องดำเนินการพร้อมกันขณะที่ทำงานอยู่เบื้องหน้า เช่น แอปอาจต้องทําการคํานวณที่ใช้เวลานาน หากทำการคํานวณในเธรด UI ผู้ใช้จะโต้ตอบกับแอปไม่ได้จนกว่าการคํานวณจะเสร็จสิ้น ซึ่งอาจส่งผลให้เกิดข้อผิดพลาด ANR ในกรณีเช่นนี้ แอปควรใช้ตัวเลือกการทํางานแบบไม่สอดคล้อง

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

API การกําหนดเวลางาน

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

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

สถานการณ์ที่พบบ่อยที่สุดสำหรับงานเบื้องหลังมีดังนี้

  • ดึงข้อมูลจากเซิร์ฟเวอร์เป็นระยะ
  • การดึงข้อมูลเซ็นเซอร์ (เช่น ข้อมูลตัวนับก้าว)
  • การขอข้อมูลตำแหน่งเป็นระยะๆ (คุณต้องได้รับสิทธิ์ ACCESS_BACKGROUND_LOCATION ใน Android 10 ขึ้นไป)
  • การอัปโหลดเนื้อหาตามทริกเกอร์เนื้อหา เช่น รูปภาพที่กล้องสร้างขึ้น

บริการที่ทำงานอยู่เบื้องหน้า

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

การสร้างบริการที่ใช้งานอยู่ทำได้ 2 วิธี คุณสามารถประกาศ Service ของคุณเองและระบุว่าบริการดังกล่าวเป็นบริการที่ทำงานอยู่เบื้องหน้าได้โดยเรียกใช้ Service.startForeground() หรือจะใช้ WorkManager เพื่อสร้างบริการที่ทำงานอยู่เบื้องหน้าก็ได้ตามที่อธิบายไว้ในการรองรับการทำงานที่ทำงานอยู่เบื้องหน้าเป็นเวลานาน อย่างไรก็ตาม โปรดทราบว่าบริการที่ทำงานอยู่เบื้องหน้าซึ่ง WorkManager สร้างขึ้นต้องเป็นไปตามข้อจำกัดทั้งหมดเช่นเดียวกับบริการที่ทำงานอยู่เบื้องหน้าอื่นๆ WorkManager มีเพียง API เพื่อความสะดวกบางอย่างเท่านั้นที่ช่วยให้คุณสร้างบริการที่ทำงานอยู่เบื้องหน้าได้ง่ายขึ้น

API ทางเลือก

ระบบมี API ทางเลือกที่ออกแบบมาเพื่อทํางานได้ดีขึ้นสําหรับ Use Case ที่เฉพาะเจาะจงมากขึ้น หากมี API อื่นสำหรับ Use Case ของคุณ เราขอแนะนำให้ใช้ API นั้นแทนบริการที่ทำงานอยู่เบื้องหน้า เนื่องจากจะช่วยให้แอปทำงานได้ดีขึ้น เอกสารประกอบเกี่ยวกับประเภทบริการที่ทำงานอยู่เบื้องหน้าจะระบุไว้เมื่อมี API ทางเลือกที่ดีซึ่งสามารถใช้แทนประเภทบริการที่ทำงานอยู่เบื้องหน้าหนึ่งๆ

สถานการณ์ที่พบบ่อยที่สุดสำหรับการใช้ API อื่น ได้แก่

งานเริ่มต้นโดยผู้ใช้

โฟลว์ชาร์ตแสดงวิธีเลือก API ที่เหมาะสม แผนภูมินี้สรุปเนื้อหาในส่วน "งานที่ผู้ใช้เริ่ม"
รูปที่ 1: วิธีเลือก API ที่เหมาะกับการเรียกใช้งานเบื้องหลังที่ผู้ใช้เริ่ม

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

งานที่ดำเนินการอยู่ต้องทำงานต่อไปขณะที่แอปทำงานอยู่เบื้องหลังไหม

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

ผู้ใช้จะได้รับประสบการณ์การใช้งานที่ไม่ดีไหมหากงานถูกเลื่อนหรือขัดจังหวะ

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

งานที่ต้องทำสั้นๆ แต่สำคัญ

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

มี API อื่นสําหรับวัตถุประสงค์นี้โดยเฉพาะไหม

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

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

งานซึ่งตอบสนองต่อเหตุการณ์

โฟลว์ชาร์ตแสดงวิธีเลือก API ที่เหมาะสม แผนภูมินี้สรุปเนื้อหาในส่วน "งานในการตอบสนองต่อเหตุการณ์"
รูปที่ 2: วิธีเลือก API ที่เหมาะกับการเรียกใช้งานเบื้องหลังที่ทริกเกอร์โดยเหตุการณ์

บางครั้งแอปต้องทำงานในเบื้องหลังเพื่อตอบสนองต่อทริกเกอร์ เช่น

ซึ่งอาจเป็นทริกเกอร์ภายนอก (เช่น ข้อความ FCM) หรืออาจเป็นการตอบสนองต่อการปลุกที่ตั้งไว้โดยแอปเอง เช่น เกมอาจได้รับข้อความ FCM ที่บอกให้อัปเดตชิ้นงานบางอย่าง

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

หากงานใช้เวลานานกว่า 2-3 วินาที คุณอาจต้องเริ่มบริการที่ทำงานอยู่เบื้องหน้าเพื่อจัดการงาน อันที่จริงแล้ว แม้ว่าแอปของคุณจะอยู่ในเบื้องหลังอยู่ แต่แอปก็อาจได้รับอนุญาตให้เริ่มบริการที่ทำงานอยู่เบื้องหน้าได้ หากผู้ใช้เรียกใช้งานนั้นและงานดังกล่าวอยู่ในข้อยกเว้นที่อนุมัติแล้วจากข้อจำกัดการเริ่มทำงานในเบื้องหลัง เช่น หากแอปได้รับข้อความ FCM ที่มีลำดับความสำคัญสูง แอปจะได้รับอนุญาตให้เริ่มบริการที่ทำงานอยู่เบื้องหน้าแม้ว่าแอปจะอยู่ในเบื้องหลังก็ตาม

หากงานใช้เวลานานกว่า 2-3 วินาที ให้ใช้API การจัดตารางงาน