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

หากแอปกำหนดเป้าหมายเป็น 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 ชั่วโมง แต่จะมีเวลาเหลือสำหรับบริการ mediaProcessing ครบ 6 ชั่วโมง

เมื่อบริการที่ทำงานอยู่เบื้องหน้าถึงขีดจำกัด 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 พร้อมข้อความแสดงข้อผิดพลาด เช่น "เวลาสำหรับบริการที่ทำงานอยู่เบื้องหน้า ประเภท 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