แอปที่กำหนดเป้าหมายเป็น Android 12 (API ระดับ 31) ขึ้นไปจะเริ่มบริการที่ทำงานอยู่เบื้องหน้าขณะที่แอปทำงานอยู่เบื้องหลังไม่ได้ ยกเว้นในบางกรณี หากแอปพยายามเริ่มบริการที่ทำงานอยู่เบื้องหน้าขณะที่แอปทำงานอยู่เบื้องหลัง และบริการที่ทำงานอยู่เบื้องหน้าไม่เป็นไปตามกรณีที่ยกเว้นอย่างใดอย่างหนึ่ง ระบบจะแสดง ForegroundServiceStartNotAllowedException
นอกจากนี้ หากแอปต้องการเปิดบริการที่ทำงานอยู่เบื้องหน้าซึ่งต้องใช้สิทธิ์ขณะใช้งาน (เช่น สิทธิ์เข้าถึงเซ็นเซอร์ร่างกาย กล้อง ไมโครโฟน หรือตำแหน่ง) แอปจะสร้างบริการขณะที่แอปทำงานอยู่เบื้องหลังไม่ได้ แม้ว่าแอปจะเข้าเกณฑ์การยกเว้นข้อจำกัดการเริ่มต้นทำงานในเบื้องหลังก็ตาม เหตุผลสำหรับเรื่องนี้อธิบายไว้ในส่วนข้อจำกัดในการเริ่มบริการที่ทำงานอยู่เบื้องหน้าซึ่งต้องใช้สิทธิ์ขณะใช้งาน
การยกเว้นจากข้อจำกัดในการเริ่มต้นทำงานในเบื้องหลัง
ในสถานการณ์ต่อไปนี้ แอปของคุณจะเริ่มบริการที่ทำงานอยู่เบื้องหน้าได้แม้ว่าแอปจะทำงานอยู่เบื้องหลังก็ตาม
- แอปเปลี่ยนจากสถานะที่ผู้ใช้มองเห็นได้ เช่น กิจกรรม
- แอปของคุณสามารถเริ่มกิจกรรมจากเบื้องหลังได้ ยกเว้นในกรณีที่แอปมีกิจกรรมใน Back Stack ของงานที่มีอยู่
แอปของคุณได้รับข้อความที่มีลำดับความสำคัญสูงโดยใช้ Firebase Cloud Messaging
ผู้ใช้ดำเนินการกับองค์ประกอบ UI ที่เกี่ยวข้องกับแอปของคุณ เช่น อาจโต้ตอบกับบับเบิล การแจ้งเตือน วิดเจ็ต หรือกิจกรรม
แอปของคุณเรียกใช้สัญญาณปลุกเจาะจงเพื่อดำเนินการตามที่ผู้ใช้ขอ
แอปของคุณเป็นวิธีการป้อนข้อมูลปัจจุบันของอุปกรณ์
แอปของคุณได้รับเหตุการณ์ที่เกี่ยวข้องกับการกำหนดเขตพื้นที่เสมือนหรือการเปลี่ยนผ่านการจดจำกิจกรรม
หลังจากอุปกรณ์รีบูตและได้รับการดำเนินการตามความตั้งใจ
ACTION_BOOT_COMPLETED,ACTION_LOCKED_BOOT_COMPLETEDหรือACTION_MY_PACKAGE_REPLACEDใน Broadcast Receiverแอปของคุณจะได้รับการดำเนินการตาม Intent
ACTION_TIMEZONE_CHANGED,ACTION_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