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