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

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