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

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

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

คำศัพท์

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

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

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

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

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

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

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

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

การทำงานแบบอะซิงโครนัส

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

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

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

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

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

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

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

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

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

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

API ทางเลือก

ระบบมี API อื่นๆ ที่ออกแบบมาให้ทำงานได้ดีขึ้นสำหรับ Use Case ที่เฉพาะเจาะจงมากขึ้น หากมี API อื่นสำหรับกรณีการใช้งานของคุณ เราขอแนะนำให้ใช้ 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 การกำหนดเวลางาน