หากแอปกำหนดเป้าหมายเป็น Android 15 ขึ้นไป ระบบจะจำกัดระยะเวลาที่อนุญาตให้บริการที่ทำงานอยู่เบื้องหน้าบางรายการทำงานขณะที่แอปทำงานอยู่เบื้องหลัง ปัจจุบันข้อจำกัดนี้มีผลกับบริการที่ทำงานอยู่เบื้องหน้า dataSync
และ mediaProcessing
ประเภทเท่านั้น shortService
ประเภทบริการที่ทำงานอยู่เบื้องหน้ามีข้อจำกัดที่เข้มงวดกว่า ซึ่งจะกล่าวถึงในเอกสารประกอบของประเภทบริการนั้น
ลักษณะการหมดเวลา
ระบบอนุญาตให้บริการที่ทำงานอยู่เบื้องหน้า dataSync
และ mediaProcessing
ทำงานได้ทั้งหมด 6 ชั่วโมงในระยะเวลา 24 ชั่วโมง หลังจากนั้นระบบจะเรียกใช้เมธอด Service.onTimeout(int, int)
ของบริการที่ทำงานอยู่ (เปิดตัวใน Android 15) (เพิ่มประเภทบริการที่ทำงานอยู่เบื้องหน้า mediaProcessing
ใน Android 15) ระบบจะติดตามการจำกัดเวลา 6 ชั่วโมงแยกกันสำหรับบริการ dataSync
และ mediaProcessing
ตัวอย่างเช่น หากบริการ dataSync
ทำงานไปเพียง 1 ชั่วโมง แอปจะมีเวลาให้บริการ dataSync
ที่ทำงานอยู่เบื้องหน้าเพียง 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]"
หากต้องการหลีกเลี่ยงปัญหาเกี่ยวกับการเปลี่ยนแปลงลักษณะการทํางานนี้ ให้ทําอย่างใดอย่างหนึ่งต่อไปนี้
- ขอให้บริการของคุณใช้วิธีการ
Service.onTimeout(int, int)
ใหม่ เมื่อแอปได้รับการติดต่อกลับ โปรดโทรหาstopSelf()
ภายในไม่กี่วินาที (หากคุณไม่หยุดแอปทันที ระบบจะสร้างสถานะ "ไม่สำเร็จ") - ตรวจสอบว่าบริการ
dataSync
และmediaProcessing
ของแอปทำงานไม่เกิน 6 ชั่วโมงโดยรวมในช่วง 24 ชั่วโมง (เว้นแต่ผู้ใช้จะโต้ตอบกับแอป ซึ่งจะเป็นการรีเซ็ตตัวจับเวลา) - เริ่มต้นบริการที่ทำงานอยู่เบื้องหน้า
dataSync
หรือmediaProcessing
เฉพาะในกรณีที่มีการโต้ตอบโดยตรงจากผู้ใช้ เนื่องจากแอปของคุณอยู่ในเบื้องหน้าเมื่อบริการเริ่มต้นขึ้น บริการของคุณจึงมีเวลา 6 ชั่วโมงเต็มหลังจากที่แอปเปลี่ยนไปทำงานอยู่เบื้องหลัง - โปรดใช้ API อื่น เช่น WorkManager แทนบริการที่ทำงานอยู่เบื้องหน้าเหล่านี้ โดยเฉพาะอย่างยิ่ง ให้ลองใช้API อื่นแทน
dataSync
บริการที่ทำงานอยู่เบื้องหน้า
หากบริการที่ทำงานอยู่เบื้องหน้า dataSync
ของแอปทำงานเป็นเวลา 6 ชั่วโมงในช่วง 24 ชั่วโมงที่ผ่านมา คุณจะไม่สามารถเริ่มบริการที่ทำงานอยู่เบื้องหน้า dataSync
อื่นได้เว้นแต่ผู้ใช้จะนำแอปของคุณไปไว้ที่เบื้องหน้า (ซึ่งจะรีเซ็ตตัวจับเวลา) หากคุณพยายามเริ่มdataSync
บริการที่ทำงานอยู่เบื้องหน้าอีกรายการ ระบบจะแสดงForegroundServiceStartNotAllowedException
พร้อมข้อความแสดงข้อผิดพลาด เช่น "บริการที่ทำงานอยู่เบื้องหน้าประเภท 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