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