ข้อจำกัดเกี่ยวกับการเริ่มบริการที่ทำงานอยู่เบื้องหน้าจากเบื้องหลัง

แอปที่กําหนดเป้าหมายเป็น Android 12 (API ระดับ 31) ขึ้นไปจะไม่สามารถเริ่มบริการที่ทำงานอยู่เบื้องหน้าขณะที่แอปทำงานอยู่เบื้องหลัง ยกเว้นบางกรณีพิเศษ หากแอปพยายามเริ่มบริการที่ทำงานอยู่เบื้องหน้าขณะที่แอปทำงานอยู่เบื้องหลัง และบริการที่ทำงานอยู่เบื้องหน้าไม่ตรงกับกรณียกเว้นข้อใดข้อหนึ่ง ระบบจะแสดงForegroundServiceStartNotAllowedException

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

ข้อยกเว้นจากข้อจำกัดการเริ่มต้นทำงานในเบื้องหลัง

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

ข้อจำกัดในการเริ่มบริการที่ทำงานอยู่เบื้องหน้าซึ่งต้องใช้สิทธิ์ขณะใช้งาน

ใน Android 14 (API ระดับ 34) ขึ้นไป โปรดทราบว่ามีสถานการณ์พิเศษที่ควรทราบหากคุณกำลังเริ่มบริการที่ทำงานอยู่เบื้องหน้าซึ่งต้องใช้สิทธิ์ขณะใช้งาน

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

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

ในทำนองเดียวกัน หากแอปทำงานอยู่เบื้องหลังและสร้างบริการด้านสุขภาพที่ต้องใช้สิทธิ์ BODY_SENSORS แสดงว่าขณะนี้แอปไม่มีสิทธิ์ดังกล่าว และระบบจะแสดงข้อยกเว้น (ข้อกำหนดนี้จะไม่มีผลหากเป็นบริการด้านสุขภาพที่ต้องได้รับสิทธิ์อื่น เช่น ACTIVITY_RECOGNITION) การเรียกใช้ PermissionChecker.checkSelfPermission()ไม่ได้ป้องกันปัญหานี้ หากแอปมีสิทธิ์ขณะใช้งาน และเรียกใช้ checkSelfPermission() เพื่อตรวจสอบว่ามีสิทธิ์ดังกล่าวหรือไม่ วิธีการจะแสดงผลเป็น PERMISSION_GRANTED แม้ว่าแอปจะทำงานอยู่เบื้องหลังก็ตาม เมื่อเมธอดแสดงผลเป็น PERMISSION_GRANTED แสดงว่า "แอปของคุณมีสิทธิ์นี้ขณะใช้งานแอป"

ด้วยเหตุนี้ หากบริการที่ทำงานอยู่เบื้องหน้าต้องการสิทธิ์ขณะใช้งาน คุณต้องเรียกใช้ Context.startForegroundService() หรือ Context.bindService() ขณะที่แอปมีกิจกรรมที่มองเห็นได้ เว้นแต่บริการจะอยู่ในข้อยกเว้นที่ระบุไว้ข้อใดข้อหนึ่ง

ข้อยกเว้นจากข้อจำกัดเกี่ยวกับสิทธิ์ขณะใช้งาน

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

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

รายการต่อไปนี้เป็นสถานการณ์เหล่านี้

  • คอมโพเนนต์ของระบบจะเริ่มบริการ
  • บริการจะเริ่มทํางานด้วยการโต้ตอบกับแอป วิดเจ็ต
  • บริการจะเริ่มขึ้นด้วยการโต้ตอบกับการแจ้งเตือน
  • บริการจะเริ่มเป็น PendingIntent ที่ส่งมาจากแอปที่มองเห็นได้แอปอื่น
  • บริการจะเริ่มต้นโดยแอปที่เป็นเครื่องมือควบคุมนโยบายด้านอุปกรณ์ที่ทำงานในโหมดเจ้าของอุปกรณ์
  • บริการจะเริ่มต้นโดยแอปที่ระบุ VoiceInteractionService
  • บริการจะเริ่มขึ้นโดยแอปที่มีสิทธิ์พิเศษSTART_ACTIVITIES_FROM_BACKGROUND

ตรวจสอบว่าบริการใดในแอปได้รับผลกระทบ

เมื่อทดสอบแอป ให้เริ่มบริการที่ทำงานอยู่เบื้องหน้าของแอป หากบริการที่เริ่มทำงานมีการจำกัดการเข้าถึงตำแหน่ง ไมโครโฟน และกล้อง ข้อความต่อไปนี้จะปรากฏใน Logcat

Foreground service started from background can not have \
location/camera/microphone access: service SERVICE_NAME