แอปมักจะต้องทำสิ่งต่างๆ มากกว่า 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 อื่นมีดังนี้
- ใช้การโอนข้อมูลที่ผู้ใช้เริ่มต้นเพื่อดาวน์โหลดหรืออัปโหลดไฟล์ขนาดใหญ่ แทนการสร้างบริการที่ทำงานอยู่เบื้องหน้าเพื่อซิงค์ข้อมูล
- ใช้เครื่องมือจัดการอุปกรณ์ที่ใช้ร่วมกันสำหรับการจับคู่บลูทูธและการโอนข้อมูล แทนที่จะใช้บริการที่ทำงานอยู่เบื้องหน้าของอุปกรณ์ที่เชื่อมต่อ
- ใช้โหมดการแสดงภาพซ้อนภาพเพื่อเล่นวิดีโอแทนการสร้างบริการที่ทำงานอยู่เบื้องหน้าสำหรับการเล่นสื่อ
งานที่เริ่มต้นโดยผู้ใช้
หากแอปจำเป็นต้องทำงานในเบื้องหลัง และผู้ใช้เป็นผู้เริ่มการทำงานขณะที่แอปแสดงอยู่ ให้ตอบคำถามเหล่านี้เพื่อค้นหาวิธีการที่เหมาะสม
งานจำเป็นต้องทำงานต่อขณะที่แอปอยู่ในเบื้องหลังไหม
หากไม่จำเป็นต้องรันงานต่อขณะที่แอปทำงานอยู่เบื้องหลัง คุณควรใช้งานแบบอะซิงโครนัส มีตัวเลือกมากมายสำหรับการทำงานแบบอะซิงโครนัส สิ่งสำคัญที่ต้องเข้าใจคือตัวเลือกเหล่านี้ทั้งหมดจะหยุดทำงานหากแอปทำงานอยู่เบื้องหลัง (การดาวน์โหลดจะหยุดลงด้วยหากปิดแอป) ตัวอย่างเช่น แอปโซเชียลมีเดียอาจต้องการรีเฟรชฟีดเนื้อหา แต่ไม่จำเป็นต้องดำเนินการให้เสร็จสิ้นหากผู้ใช้ออกจากหน้าจอ
ผู้ใช้จะได้รับประสบการณ์ที่ไม่ดีหรือไม่หากงานถูกเลื่อนหรือถูกขัดจังหวะ
สิ่งสำคัญคือต้องพิจารณาว่าประสบการณ์ของผู้ใช้จะได้รับผลกระทบหรือไม่หากงานถูกเลื่อนหรือยกเลิก ตัวอย่างเช่น หากแอปจำเป็นต้องอัปเดตเนื้อหา ผู้ใช้อาจไม่สังเกตเห็นว่าการดำเนินการเกิดขึ้นทันทีหรือเกิดขึ้นกลางดึกขณะที่อุปกรณ์กำลังชาร์จอยู่ ในกรณีเช่นนี้ คุณควรใช้ตัวเลือกงานเบื้องหลัง
เป็นงานสั้นๆ ที่สำคัญใช่ไหม
หากงานล่าช้าไม่ได้และจะเสร็จสมบูรณ์อย่างรวดเร็ว คุณสามารถใช้บริการที่ทำงานอยู่เบื้องหน้าที่มีประเภท shortService บริการเหล่านี้สร้างได้ง่ายกว่าบริการที่ทำงานอยู่เบื้องหน้าอื่นๆ และไม่ต้องใช้สิทธิ์มากนัก อย่างไรก็ตาม บริการสั้นๆ ต้องเสร็จสิ้นภายใน 3 นาที
มี API ทางเลือกสำหรับวัตถุประสงค์นี้โดยเฉพาะไหม
หากผู้ใช้มองเห็นงานได้ โซลูชันที่ถูกต้องอาจเป็นการใช้บริการที่ทำงานอยู่เบื้องหน้า บริการเหล่านี้จะทำงานอย่างต่อเนื่องเมื่อเริ่มต้น จึงเป็นตัวเลือกที่ดีเมื่อการขัดจังหวะงานจะทำให้ผู้ใช้ได้รับประสบการณ์ที่ไม่ดี เช่น แอปติดตามการออกกำลังกายอาจใช้เซ็นเซอร์ตำแหน่งเพื่อให้ผู้ใช้บันทึกเส้นทางการวิ่งจ็อกกิ้งบนแผนที่ได้ คุณไม่ควรทำเช่นนี้กับตัวเลือกงานที่ทำงานอยู่เบื้องหลัง เพราะหากงานหยุดชั่วคราว การติดตามก็จะหยุดทันที ในสถานการณ์เช่นนี้ บริการที่ทำงานอยู่เบื้องหน้าจึงเหมาะสมที่สุด
อย่างไรก็ตาม เนื่องจากบริการที่ทำงานอยู่เบื้องหน้าอาจใช้ทรัพยากรของอุปกรณ์เป็นจำนวนมาก ระบบจึงกำหนดข้อจำกัดมากมายเกี่ยวกับเวลาและวิธีใช้บริการดังกล่าว ในหลายกรณี คุณสามารถใช้ API ทางเลือกที่จัดการงานให้คุณได้โดยมีปัญหาน้อยกว่าแทนการใช้บริการที่ทำงานอยู่เบื้องหน้า เช่น หากแอปต้องดำเนินการเมื่อผู้ใช้มาถึงสถานที่หนึ่งๆ ตัวเลือกที่ดีที่สุดคือการใช้ Geofence API แทนการติดตามตำแหน่งของผู้ใช้ด้วยบริการที่ทำงานอยู่เบื้องหน้า
งานที่ต้องทำเพื่อตอบสนองต่อเหตุการณ์
บางครั้งแอปจำเป็นต้องทำงานในเบื้องหลังเพื่อตอบสนองต่อทริกเกอร์ เช่น
- ข้อความประกาศ
- ข้อความ Firebase Cloud Messaging (FCM)
- การปลุกที่ตั้งโดยแอป
ซึ่งอาจเป็นทริกเกอร์ภายนอก (เช่น ข้อความ FCM) หรืออาจเป็นการตอบสนองต่อการปลุกที่แอปตั้งค่าไว้เอง ตัวอย่างเช่น เกมอาจได้รับข้อความ FCM ที่แจ้งให้อัปเดตเนื้อหาบางอย่าง
หากมั่นใจว่างานจะเสร็จภายในไม่กี่วินาที ให้ใช้งานแบบอะซิงโครนัสเพื่อทำงาน ระบบจะอนุญาตให้แอปของคุณใช้เวลา 2-3 วินาทีในการทำงานดังกล่าว แม้ว่าแอปจะทำงานอยู่เบื้องหลังก็ตาม
หากงานใช้เวลานานกว่า 2-3 วินาที คุณอาจต้องเริ่มบริการที่ทำงานอยู่เบื้องหน้าเพื่อจัดการงานดังกล่าว อันที่จริงแล้ว แม้ว่าแอปของคุณจะอยู่ในเบื้องหลัง แต่ก็อาจได้รับอนุญาตให้เริ่มบริการที่ทำงานอยู่เบื้องหน้าได้ หากผู้ใช้เป็นผู้เรียกให้ทำงานและงานนั้นเข้าเกณฑ์การยกเว้นจากข้อจำกัดการเริ่มต้นในเบื้องหลังที่ได้รับอนุมัติ ตัวอย่างเช่น หากแอปได้รับข้อความ FCM ที่มีลำดับความสำคัญสูง แอปจะได้รับอนุญาตให้เริ่มบริการที่ทำงานอยู่เบื้องหน้าแม้ว่าแอปจะอยู่ในเบื้องหลังก็ตาม
หากงานใช้เวลานานกว่า 2-3 วินาที ให้ใช้ API การกำหนดเวลางาน