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

แอปที่กำหนดเป้าหมายเป็น 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