หากแอปกำหนดเป้าหมายเป็น 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