แอปที่กำหนดเป้าหมายเป็น Android 12 (API ระดับ 31) ขึ้นไปจะเริ่มบริการที่ทำงานอยู่เบื้องหน้าไม่ได้
ขณะที่แอปทำงานอยู่ในเบื้องหลัง ยกเว้นบางกรณีพิเศษ หากแอปพยายามเริ่มต้น
บริการที่ทำงานอยู่เบื้องหน้าขณะที่แอปทำงานในเบื้องหลัง และบริการที่ทำงานอยู่เบื้องหน้า
ไม่เป็นไปตามกรณีพิเศษใดกรณีหนึ่ง ระบบจะแสดง ForegroundServiceStartNotAllowedException
นอกจากนี้ หากแอปต้องการเปิดใช้บริการที่ทำงานอยู่เบื้องหน้าที่ต้องใช้สิทธิ์ ขณะใช้งาน (เช่น เซ็นเซอร์ตรวจจับร่างกาย กล้อง ไมโครโฟน หรือ สิทธิ์เข้าถึงตำแหน่ง ) แอปจะสร้างบริการไม่ได้ขณะที่แอปทำงานอยู่ในเบื้องหลัง แม้ว่าแอปจะเข้าข่ายข้อยกเว้นข้อใดข้อหนึ่งจากข้อจำกัดในการเริ่มต้นในเบื้องหลังก็ตาม เหตุผลของเรื่องนี้อธิบายไว้ในส่วนข้อจำกัดในการเริ่มบริการที่ทำงานอยู่เบื้องหน้าที่ต้องใช้สิทธิ์ขณะใช้งาน
ข้อยกเว้นจากข้อจำกัดในการเริ่มต้นทำงานในเบื้องหลัง
ในสถานการณ์ต่อไปนี้ แอปจะเริ่มบริการที่ทำงานอยู่เบื้องหน้าได้แม้ว่าแอปจะทำงานอยู่เบื้องหลังก็ตาม
- แอปเปลี่ยนจากสถานะที่ผู้ใช้มองเห็น เช่น Activity
- แอปสามารถเริ่มกิจกรรมจาก เบื้องหลังได้ ยกเว้นในกรณีที่ แอปมีกิจกรรมใน Back Stack ของงานที่มีอยู่
แอปของคุณได้รับข้อความที่มีลำดับความสำคัญสูงโดยใช้ Firebase Cloud Messaging
ผู้ใช้ดำเนินการกับองค์ประกอบ UI ที่เกี่ยวข้องกับแอปของคุณ เช่น ผู้ใช้อาจโต้ตอบกับบับเบิล การแจ้งเตือน วิดเจ็ต หรือกิจกรรม
แอปของคุณเรียกใช้การปลุกในเวลาที่แน่นอนเพื่อ ดำเนินการที่ผู้ใช้ขอให้เสร็จสมบูรณ์
แอปของคุณคือวิธีการป้อนข้อมูลปัจจุบันของอุปกรณ์
แอปของคุณได้รับเหตุการณ์ที่เกี่ยวข้องกับ รั้วภูมิศาสตร์หรือการเปลี่ยนการจดจำ กิจกรรม
หลังจากอุปกรณ์รีบูตและรับการดำเนินการตาม Intent ของ
ACTION_BOOT_COMPLETEDACTION_LOCKED_BOOT_COMPLETEDหรือACTION_MY_PACKAGE_REPLACEDใน Broadcast Receiverแอปของคุณได้รับการดำเนินการ Intent
ACTION_TIMEZONE_CHANGEDACTION_TIME_CHANGEDหรือACTION_LOCALE_CHANGEDใน Broadcast Receiverแอปของคุณได้รับเหตุการณ์
ACTION_TRANSACTION_DETECTEDจากNfcServiceแอปที่มีบทบาทหรือสิทธิ์บางอย่างของระบบ เช่น เจ้าของ อุปกรณ์ และเจ้าของ โปรไฟล์
แอปของคุณใช้ Companion Device Manager และประกาศสิทธิ์
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDหรือสิทธิ์REQUEST_COMPANION_RUN_IN_BACKGROUNDใช้REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDทุกครั้งที่ทำได้ผู้ใช้ปิดการเพิ่มประสิทธิภาพแบตเตอรี่สำหรับแอปของคุณ
แอปของคุณมีสิทธิ์
SYSTEM_ALERT_WINDOWหมายเหตุ: หากแอปกำหนดเป้าหมายเป็น Android 15 ขึ้นไป แอปต้องมีSYSTEM_ALERT_WINDOWสิทธิ์และแอปต้องมีหน้าต่างซ้อนทับที่มองเห็นได้ในขณะนี้
ข้อจำกัดในการเริ่มบริการที่ทำงานอยู่เบื้องหน้าที่ต้องใช้สิทธิ์ขณะใช้งาน
ใน 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