หากแอปกำหนดเป้าหมายเป็น Android 15 ขึ้นไป ระบบจะจำกัดระยะเวลาที่บริการที่ทำงานอยู่เบื้องหน้าบางอย่างได้รับอนุญาตให้ทำงานขณะที่แอปทำงานอยู่เบื้องหลัง ปัจจุบัน ข้อจำกัดนี้ใช้กับ
dataSync และ
mediaProcessing ประเภทบริการที่ทำงานอยู่เบื้องหน้า ที่ทำงานอยู่เบื้องหน้า
เท่านั้น บริการที่ทำงานอยู่เบื้องหน้าประเภท shortService มีข้อจำกัดที่เข้มงวดกว่า ซึ่งอธิบายไว้ในเอกสารประกอบของบริการประเภทนั้น
ลักษณะการทำงานเมื่อถึงระยะหมดเวลา
ระบบอนุญาตให้บริการที่ทำงานอยู่เบื้องหน้า dataSync และ mediaProcessing ทำงาน
รวมกันได้ 6 ชั่วโมงในระยะเวลา 24 ชั่วโมง หลังจากนั้นระบบจะเรียกใช้
เมธอด Service.onTimeout(int, int) ของบริการที่กำลังทำงานอยู่
(เปิดตัวใน Android 15) (บริการที่ทำงานอยู่เบื้องหน้าประเภท mediaProcessing เพิ่มเข้ามาใน Android 15) ระบบจะติดตามการจำกัดเวลา 6 ชั่วโมงแยกกันสำหรับบริการ dataSync และ mediaProcessing ตัวอย่างเช่น หากบริการ dataSync เพิ่งทำงานไป 1 ชั่วโมง แอปจะมีเวลาเหลืออีก 5 ชั่วโมงสำหรับบริการที่ทำงานอยู่เบื้องหน้า dataSync แต่จะมีเวลาเหลืออีก 6 ชั่วโมงเต็มสำหรับบริการ mediaProcessing
เมื่อบริการที่ทำงานอยู่เบื้องหน้าถึงขีดจำกัด 6 ชั่วโมง บริการจะมีเวลาไม่กี่
วินาทีในการเรียกใช้ Service.stopSelf() เมื่อระบบเรียกใช้ Service.onTimeout() ระบบจะไม่ถือว่าบริการดังกล่าวเป็นบริการที่ทำงานอยู่เบื้องหน้าอีกต่อไป
หากบริการไม่เรียกใช้ Service.stopSelf() ระบบจะแสดงข้อยกเว้นภายใน ระบบจะบันทึกข้อยกเว้นใน Logcat พร้อมข้อความต่อไปนี้
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
คุณสามารถทำอย่างน้อย 1 อย่างต่อไปนี้เพื่อหลีกเลี่ยงปัญหาที่เกิดจากการเปลี่ยนแปลงลักษณะการทำงานนี้
- ให้บริการของคุณใช้เมธอด
Service.onTimeout(int, int)ใหม่ เมื่อแอปได้รับการเรียกกลับ ให้เรียกใช้stopSelf()ภายในไม่กี่วินาที (หากคุณไม่หยุดแอปทันที ระบบจะสร้างข้อผิดพลาด) - ตรวจสอบว่าบริการ
dataSyncและmediaProcessingของแอปทำงานไม่เกิน 6 ชั่วโมงในระยะเวลา 24 ชั่วโมง (เว้นแต่ผู้ใช้จะโต้ตอบกับแอป ซึ่งจะรีเซ็ตตัวจับเวลา) - เริ่มบริการที่ทำงานอยู่เบื้องหน้า
dataSyncหรือmediaProcessingเท่านั้นอันเป็นผลมาจากการโต้ตอบของผู้ใช้โดยตรง เนื่องจากแอปจะทำงานอยู่เบื้องหน้าเมื่อบริการเริ่มต้น บริการของคุณจึงมีเวลา 6 ชั่วโมงเต็มหลังจากที่แอปไปทำงานอยู่เบื้องหลัง - ใช้ API อื่น เช่น WorkManager แทนการใช้บริการที่ทำงานอยู่เบื้องหน้าเหล่านี้ โดยเฉพาะอย่างยิ่ง ให้ลองใช้
API อื่นแทนการใช้บริการที่ทำงานอยู่เบื้องหน้า
dataSync
หากบริการที่ทำงานอยู่เบื้องหน้า dataSync ของแอปทำงานไป 6 ชั่วโมงในช่วง
24 ชั่วโมงที่ผ่านมา คุณจะเริ่มบริการที่ทำงานอยู่เบื้องหน้า dataSync อื่นไม่ได้ เว้นแต่ ผู้ใช้
จะนำแอปมาไว้เบื้องหน้า (ซึ่งจะรีเซ็ตตัวจับเวลา) หากคุณพยายามที่จะ
เริ่มบริการที่ทำงานอยู่เบื้องหน้า dataSync อื่น ระบบจะแสดง
ForegroundServiceStartNotAllowedException
พร้อมข้อความแสดงข้อผิดพลาด เช่น "Time limit already exhausted for foreground service
type dataSync"
การทดสอบ
หากต้องการทดสอบลักษณะการทำงานของแอป คุณสามารถเปิดใช้ระยะหมดเวลาการซิงค์ข้อมูลได้แม้ว่าแอปจะไม่ได้กำหนดเป้าหมายเป็น Android 15 (ตราบใดที่แอปทำงานบนอุปกรณ์ Android 15) หากต้องการเปิดใช้ระยะหมดเวลา ให้เรียกใช้คำสั่ง adb ต่อไปนี้
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
นอกจากนี้ คุณยังปรับระยะหมดเวลาได้เพื่อให้ทดสอบลักษณะการทำงานของแอปเมื่อถึงขีดจำกัดได้ง่ายขึ้น หากต้องการตั้งค่าระยะหมดเวลาใหม่สำหรับบริการที่ทำงานอยู่เบื้องหน้า dataSync ให้เรียกใช้คำสั่ง adb ต่อไปนี้
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
หากต้องการตั้งค่าระยะหมดเวลาใหม่สำหรับบริการที่ทำงานอยู่เบื้องหน้า mediaProcessing ให้เรียกใช้คำสั่งนี้
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds