หากแอปกำหนดเป้าหมายเป็น 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 ชั่วโมง บริการจะมีเวลา 2-3
วินาทีในการเรียกใช้ 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()ภายใน 2-3 วินาที (หากคุณไม่หยุดแอปทันที ระบบจะสร้างข้อผิดพลาด) - ตรวจสอบว่าบริการ
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