หากแอปกำหนดเป้าหมายเป็น 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 อย่างต่อไปนี้
- ให้บริการของคุณใช้วิธีการใหม่ของ
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