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

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