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

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