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

หากแอปกำหนดเป้าหมายเป็น 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 อย่างต่อไปนี้เพื่อหลีกเลี่ยงปัญหาที่เกิดจากการเปลี่ยนแปลงลักษณะการทำงานนี้

  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 พร้อมข้อความแสดงข้อผิดพลาด เช่น "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