ระยะหมดเวลาของบริการที่ทำงานอยู่เบื้องหน้า

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

หากต้องการหลีกเลี่ยงปัญหาเกี่ยวกับการเปลี่ยนแปลงลักษณะการทํางานนี้ ให้ทําอย่างใดอย่างหนึ่งต่อไปนี้

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