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