หน้านี้จะกล่าวถึงสาเหตุทั่วไปที่บริการที่ทำงานอยู่เบื้องหน้าอาจไม่ทำงาน และช่วยคุณระบุสาเหตุของปัญหา
เอกสารนี้กล่าวถึงปัญหาต่อไปนี้
ก่อนแก้ปัญหา
ตรวจสอบการเปลี่ยนแปลงล่าสุดในบริการที่ทำงานอยู่เบื้องหน้า
หากใช้บริการที่ทำงานอยู่เบื้องหน้าอย่างไม่เหมาะสม อาจส่งผลเสียต่อประสิทธิภาพของอุปกรณ์และอายุการใช้งานแบตเตอรี่ ด้วยเหตุนี้ แพลตฟอร์ม Android จึงมักจะเปลี่ยนแปลงลักษณะการทำงานของบริการที่ทำงานอยู่เบื้องหน้าเพื่อจำกัดผลกระทบที่ไม่ดีเหล่านี้
หากพบปัญหาเกี่ยวกับบริการที่ทำงานอยู่เบื้องหน้า คุณควรอ่านเอกสารประกอบเกี่ยวกับการเปลี่ยนแปลงบริการที่ทำงานอยู่เบื้องหน้าเพื่อดูว่ามีการเปลี่ยนแปลงล่าสุดที่อาจอธิบายปัญหาของคุณได้หรือไม่ คุณควรตรวจสอบการเปลี่ยนแปลงในสถานการณ์ต่อไปนี้
- โค้ดบริการที่ทำงานอยู่เบื้องหน้าซึ่งก่อนหน้านี้ใช้งานได้ไม่ทำงาน
- คุณเพิ่งเริ่มทดสอบในแพลตฟอร์มรุ่นใหม่ หรือคุณเปลี่ยนระดับ API ที่แอปกำหนดเป้าหมาย
นอกจากนี้ หากคุณทดสอบอุปกรณ์ในเวอร์ชันตัวอย่างสำหรับนักพัฒนาซอฟต์แวร์ของแพลตฟอร์ม โปรดอ่านเอกสารประกอบเวอร์ชันตัวอย่างสำหรับนักพัฒนาซอฟต์แวร์เวอร์ชันล่าสุด
ข้อผิดพลาด "แอปพลิเคชันไม่ตอบสนอง (ANR)"
ในบางกรณี แอปควรปิดบริการที่ทำงานอยู่เบื้องหน้า หากแอปไม่หยุดบริการ ระบบจะหยุดบริการและแสดงข้อผิดพลาดแอปพลิเคชันไม่ตอบสนอง (ANR)
บริการแบบสั้นทำงานนานเกินไปจนทำให้เกิด ANR
บริการที่ทำงานอยู่เบื้องหน้าซึ่งใช้ประเภทบริการระยะสั้นต้องดำเนินการให้เสร็จภายในเวลาประมาณ 3 นาที เมื่อหมดเวลา ระบบจะเรียกใช้เมธอด Service.onTimeout(int,int)
ของบริการ บริการมีเวลา 2-3 วินาทีในการโทรหา stopSelf()
หากบริการไม่หยุดเอง ระบบจะแสดงข้อผิดพลาด "แอปพลิเคชันไม่ตอบสนอง"
วิเคราะห์
หาก ANR เกิดจากบริการที่ทำงานอยู่เบื้องหน้าหยุดตัวเองไม่สำเร็จ ระบบจะแสดงข้อยกเว้นภายใน คุณสามารถตรวจสอบว่าปัญหานี้เกิดจากสาเหตุดังกล่าวได้โดยดูจาก Logcat ในกรณีนี้ บันทึกจะมีข้อความต่อไปนี้
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type FOREGROUND_SERVICE_TYPE_SHORT_SERVICE did not stop within its timeout:
[component name]"
แก้ไข
ตรวจสอบว่าบริการที่ทำงานอยู่เบื้องหน้าแบบจำกัดเวลาทั้งหมดทำงานเสร็จสิ้นและเรียกใช้ stopForeground(int)
ภายในขีดจำกัดเวลาของระบบ
ใช้บริการที่ทำงานอยู่เบื้องหน้า Service.onTimeout(int,int)
ตรวจสอบว่าการติดตั้งใช้งานเมธอดดังกล่าวเรียก stopSelf()
ทันที
ข้อยกเว้นบริการที่ทำงานอยู่เบื้องหน้า
ส่วนนี้จะอธิบายปัญหาเกี่ยวกับบริการที่ทำงานอยู่เบื้องหน้าหลายประการที่อาจทําให้ระบบแสดงข้อยกเว้น หากแอปไม่จับข้อยกเว้น ผู้ใช้จะเห็นกล่องโต้ตอบแจ้งว่าแอปหยุดทำงาน
ในบางกรณี ระบบจะแสดงข้อยกเว้นภายใน คุณจะจับข้อยกเว้นเหล่านั้นไม่ได้ แต่สามารถดูใน Logcat เพื่อดูว่าระบบยกเว้นข้อใด
ข้อยกเว้นภายใน: หมดเวลา
ระบบจะจำกัดระยะเวลาที่บริการที่ทำงานอยู่เบื้องหน้าสำหรับการซิงค์ข้อมูลและการประมวลผลสื่อจะทำงานได้ขณะที่แอปทำงานอยู่เบื้องหลัง หากบริการมีจำนวนเกินขีดจำกัดดังกล่าว ระบบจะเรียกใช้เมธอด Service.onTimeout(int,int)
ของบริการ บริการมีเวลา 2-3 วินาทีในการโทรหา
stopSelf()
หากบริการไม่หยุดเอง ระบบจะสร้างข้อยกเว้นภายในซึ่งทําให้แอปขัดข้อง
วิเคราะห์
หากสาเหตุคือหมดเวลา Logcat จะมีข้อความต่อไปนี้
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
แก้ไข
ตรวจสอบว่าบริการที่ทำงานอยู่เบื้องหน้าแบบจำกัดเวลาทั้งหมดทำงานเสร็จสิ้นและเรียกใช้ stopForeground(int)
ภายในขีดจำกัดเวลาของระบบ
ใช้บริการที่ทำงานอยู่เบื้องหน้า Service.onTimeout(int,int)
ตรวจสอบว่าการใช้งานเมธอดดังกล่าวเรียก stopSelf()
ทันที
ข้อยกเว้นภายใน: ForegroundServiceDidNotStartInTimeException
เมื่อคุณเปิดบริการด้วยการเรียกใช้ context.startForegroundService()
บริการดังกล่าวจะมีเวลา 2-3 วินาทีในการโปรโมตตัวเองเป็นบริการที่ทำงานอยู่เบื้องหน้าด้วยการเรียกใช้ ServiceCompat.startForeground()
หากบริการไม่ดำเนินการดังกล่าว ระบบจะแสดงข้อผิดพลาด ANR
วิเคราะห์
หากบริการที่ทำงานอยู่เบื้องหน้าไม่เริ่มทำงานภายในเวลาที่กำหนด แอปจะขัดข้อง ทำให้ผู้ใช้เห็นกล่องโต้ตอบแอปหยุดทำงานแล้ว ในกรณีนี้ คุณจะเห็นข้อความต่อไปนี้ใน Logcat
android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException:
Context.startForegroundService() did not then call Service.startForeground()
แก้ไข
ตรวจสอบว่าบริการที่ทำงานอยู่เบื้องหน้าทั้งหมดที่สร้างขึ้นใหม่เรียกใช้ ServiceCompat.startForeground()
ภายในไม่กี่วินาที
ForegroundServiceStartNotAllowedException
ข้อผิดพลาด:
ระบบแสดง ForegroundServiceStartNotAllowedException
สาเหตุ
ซึ่งมักเกิดจากแอปเปิดบริการที่ทำงานอยู่เบื้องหน้าจากเบื้องหลังเมื่อไม่มีการยกเว้นที่ถูกต้อง
ตั้งแต่ Android 12 (API ระดับ 31) เป็นต้นไป แอปไม่ได้รับอนุญาตให้เริ่มบริการที่ทำงานอยู่เบื้องหน้าขณะที่แอปทำงานอยู่เบื้องหลัง โดยมีข้อยกเว้นบางประการ
หากคุณพยายามเริ่มบริการที่ทำงานอยู่เบื้องหน้าจากเบื้องหลังและไม่ได้ปฏิบัติตามข้อกำหนดของการยกเว้นข้อใดข้อหนึ่ง ระบบจะแสดงข้อผิดพลาด ForegroundServiceStartNotAllowedException
ระบบจะดำเนินการนี้ด้วยหากคุณไม่เป็นไปตามข้อกำหนดของการยกเว้น
เช่น แอปอาจมีปุ่มที่ผู้ใช้คลิกได้ ซึ่งทำให้แอปประมวลผลบางอย่างแล้วเปิดบริการที่ทำงานอยู่เบื้องหน้า ในกรณีนี้ ผู้ใช้อาจคลิกปุ่มแล้วซ่อนแอปไว้ในเบื้องหลังทันที ในกรณีนี้ แอปจะพยายามเปิดบริการจากเบื้องหลัง หากแอปไม่เป็นไปตามข้อยกเว้นที่ระบุ ระบบจะแสดง ForegroundServiceStartNotAllowedException
นอกจากนี้ ข้อยกเว้นบางรายการยังมีเวลาจำกัด ตัวอย่างเช่น จะมีการยกเว้นสั้นๆ หากแอปของคุณเปิดบริการที่ทำงานอยู่เบื้องหน้าเพื่อตอบสนองต่อข้อความ FCM ที่มีลำดับความสำคัญสูง หากเปิดใช้บริการไม่ทันเวลา คุณจะได้รับ ForegroundServiceStartNotAllowedException
บางครั้งข้อยกเว้นบางอย่างอาจเข้มงวดมากขึ้นเมื่อ Android ออกเวอร์ชันใหม่ หากคุณได้เปลี่ยนเวอร์ชัน Android ที่แอปกำหนดเป้าหมาย ให้ตรวจสอบเอกสารประกอบเกี่ยวกับการเปลี่ยนแปลงบริการที่ทำงานอยู่เบื้องหน้า และยืนยันว่าแอปของคุณยังคงเป็นไปตามข้อยกเว้นที่อนุญาตข้อใดข้อหนึ่ง
แก้ไข
เปลี่ยนเวิร์กโฟลว์ของแอปเพื่อไม่ให้ต้องเปิดบริการที่ทำงานอยู่เบื้องหน้าขณะที่แอปทำงานอยู่เบื้องหลัง หรือยืนยันว่าแอปของคุณเป็นไปตามข้อยกเว้นข้อใดข้อหนึ่ง
คุณสามารถใช้คอมโพเนนต์วงจรเช่น LiveData
เพื่อจัดการวงจรของแอปเพื่อไม่ให้พยายามเปิดบริการที่ทำงานอยู่เบื้องหน้าจากเบื้องหลังโดยไม่ตั้งใจ
SecurityException
ข้อผิดพลาด:
ระบบแสดงSecurityException
สาเหตุ
แอปของคุณพยายามเปิดบริการที่ทำงานอยู่เบื้องหน้าโดยไม่ได้รับสิทธิ์ที่จําเป็น
- หากแอปกำหนดเป้าหมายเป็น Android 9 (API ระดับ 28) ขึ้นไป แอปต้องมีสิทธิ์
FOREGROUND_SERVICE
เพื่อเปิดบริการที่ทำงานอยู่เบื้องหน้า - หากแอปกำหนดเป้าหมายเป็น Android 14 (API ระดับ 34) ขึ้นไป แอปต้องมีคุณสมบัติตรงตามข้อกําหนดเบื้องต้นทั้งหมดสําหรับประเภทบริการที่ทำงานอยู่เบื้องหน้า ข้อกําหนดเบื้องต้นเหล่านี้มีรายละเอียดอยู่ในเอกสารประกอบเกี่ยวกับประเภทบริการที่ทำงานอยู่เบื้องหน้า โดยเฉพาะอย่างยิ่ง โปรดคำนึงถึงข้อกำหนดต่อไปนี้
- บริการที่ทำงานอยู่เบื้องหน้าหลายประเภทต้องใช้สิทธิ์รันไทม์ที่เฉพาะเจาะจง เช่น บริการที่ทำงานอยู่เบื้องหน้าสำหรับการรับส่งข้อความระยะไกลต้องมีสิทธิ์
FOREGROUND_SERVICE_REMOTE_MESSAGING
- บริการที่ทำงานอยู่เบื้องหน้าหลายประเภทต้องใช้สิทธิ์รันไทม์ที่เฉพาะเจาะจง เช่น บริการที่ทำงานอยู่เบื้องหน้าสำหรับการรับส่งข้อความระยะไกลต้องมีสิทธิ์
- ในบางกรณี อาจมีข้อจำกัดเพิ่มเติมเกี่ยวกับสิทธิ์ที่จําเป็นต่อบริการที่ทำงานอยู่เบื้องหน้าบางประเภทขณะใช้งาน สิทธิ์เหล่านี้จะมอบให้กับแอปขณะที่แอปทำงานอยู่เบื้องหน้าเท่านั้น (ยกเว้นบางกรณี) ซึ่งหมายความว่าแม้ว่าแอปจะขอและได้รับสิทธิ์อย่างใดอย่างหนึ่งเหล่านี้แล้ว แต่หากแอปพยายามเปิดบริการที่ทำงานอยู่เบื้องหน้าขณะที่แอปอยู่ในเบื้องหลัง ระบบจะแสดงข้อผิดพลาด
SecurityException
แม้ว่าแอปจะได้รับการยกเว้นให้เริ่มบริการที่ทำงานอยู่เบื้องหน้าจากเบื้องหลังก็ตาม ดูข้อมูลเพิ่มเติมได้ที่ข้อจำกัดในการเริ่มบริการที่ทำงานอยู่เบื้องหน้าซึ่งต้องใช้สิทธิ์ขณะใช้งาน- คุณอาจได้รับ
SecurityException
หากขอสิทธิ์ที่จําเป็นแต่เริ่มบริการที่ทำงานอยู่เบื้องหน้าก่อนที่จะยืนยันว่าได้รับสิทธิ์ที่จําเป็นแล้ว
- คุณอาจได้รับ
แก้ไข
ก่อนเปิดบริการที่ทำงานอยู่เบื้องหน้า ให้ขอสิทธิ์บริการที่ทำงานอยู่เบื้องหน้าที่เหมาะสมทั้งหมด และยืนยันว่าคุณมีคุณสมบัติตรงตามข้อกําหนดเบื้องต้นอื่นๆ ทั้งหมดของรันไทม์