ปลุกระบบบ่อยเกินไป

Wakeup เป็นกลไกใน API ของ AlarmManager ที่ช่วยให้นักพัฒนาแอปตั้งสัญญาณปลุกเพื่อให้อุปกรณ์ปลุกระบบในเวลาที่กำหนดได้ แอปของคุณ ตั้งนาฬิกาปลุกโดยเรียกใช้เมธอด set() ใดเมธอดหนึ่งใน AlarmManager ด้วย แฟล็ก RTC_WAKEUP หรือ ELAPSED_REALTIME_WAKEUP เมื่อมีการทริกเกอร์นาฬิกาปลุกเพื่อปลุก อุปกรณ์จะออกจากโหมดประหยัดพลังงาน และจะถือWake Lock บางส่วนขณะเรียกใช้เมธอด onReceive() หรือ onAlarm() ของนาฬิกาปลุก หากมีการปลุกระบบมากเกินไป อาจทำให้แบตเตอรี่ของอุปกรณ์หมดเร็วได้

หากแอปปลุกอุปกรณ์มากเกินไป คุณสามารถใช้คำแนะนำในหน้านี้เพื่อวินิจฉัยและแก้ไขปัญหาได้

แก้ไขปัญหา

AlarmManager ได้รับการเปิดตัวในแพลตฟอร์ม Android เวอร์ชันแรกๆ แต่เมื่อเวลาผ่านไป กรณีการใช้งานหลายอย่างที่ก่อนหน้านี้ต้องใช้ AlarmManager ตอนนี้ใช้ฟีเจอร์ใหม่ๆ เช่น WorkManager ได้ดีกว่า ส่วนนี้มีเคล็ดลับในการลดการปลุกด้วยการตั้งปลุก แต่ในระยะยาว ให้พิจารณาการย้ายข้อมูลแอปเพื่อให้เป็นไปตามคำแนะนำในส่วนแนวทางปฏิบัติ แนะนำ

ระบุตำแหน่งในแอปที่คุณตั้งเวลาปลุกและลดความถี่ที่การปลุกเหล่านั้นจะทริกเกอร์ โดยมีเคล็ดลับดังนี้

  • มองหาการเรียกใช้เมธอดต่างๆ ของ set() ใน AlarmManager ที่มี ทั้ง RTC_WAKEUP หรือ ELAPSED_REALTIME_WAKEUP

  • เราขอแนะนำให้ใส่ชื่อแพ็กเกจ คลาส หรือเมธอดในแท็ก ชื่อของสัญญาณเตือนเพื่อให้คุณระบุตำแหน่งในแหล่งที่มาที่ ตั้งสัญญาณเตือนได้ง่าย เคล็ดลับเพิ่มเติมมีดังนี้

    • อย่าใส่ข้อมูลที่ระบุตัวบุคคลได้ (PII) ในชื่อ เช่น อีเมล มิเช่นนั้น อุปกรณ์จะบันทึก _UNKNOWN แทนชื่อการปลุก
    • อย่ารับชื่อคลาสหรือชื่อเมธอดโดยใช้โปรแกรม เช่น โดยการเรียกใช้ getName() เนื่องจาก Proguard อาจทำให้ชื่อเหล่านั้นอ่านไม่ออก ให้ใช้สตริงที่ฮาร์ดโค้ดแทน
    • อย่าเพิ่มตัวนับหรือตัวระบุที่ไม่ซ้ำกันลงในแท็กการแจ้งเตือน ระบบจะรวบรวมการปลุกที่ตั้งค่าด้วยวิธีดังกล่าวไม่ได้เนื่องจากแต่ละรายการมีตัวระบุที่ไม่ซ้ำกัน

หลังจากแก้ไขปัญหาแล้ว ให้ตรวจสอบว่าการปลุกระบบทำงานตามที่คาดไว้โดยเรียกใช้คำสั่ง adb ต่อไปนี้

adb shell dumpsys alarm

คำสั่งนี้ให้ข้อมูลเกี่ยวกับสถานะของบริการของระบบเตือนภัยในอุปกรณ์ ดูข้อมูลเพิ่มเติมได้ที่ dumpsys

แนวทางปฏิบัติแนะนำ

ใช้การปลุกระบบเฉพาะในกรณีที่แอปต้องดำเนินการที่แสดงต่อผู้ใช้ (เช่น โพสต์การแจ้งเตือนหรือแจ้งเตือนผู้ใช้) ดูรายการแนวทางปฏิบัติแนะนำสำหรับ AlarmManager ได้ที่การตั้งเวลา การปลุก

อย่าใช้ AlarmManager เพื่อ ตั้งเวลางานที่ทำงานอยู่เบื้องหลัง โดยเฉพาะงานที่ทำงานอยู่เบื้องหลังที่ทำซ้ำหรือเครือข่าย ใช้ WorkManager เพื่อกำหนดเวลางานในเบื้องหลังเนื่องจากมีข้อดีดังต่อไปนี้

  • การจัดกลุ่ม - รวมงานต่างๆ เพื่อลดการใช้แบตเตอรี่
  • ความคงทน - หากอุปกรณ์รีบูต งาน WorkManager ที่กำหนดเวลาไว้จะทำงานหลังจากรีบูตเสร็จสิ้น
  • เกณฑ์ - งานจะทำงานตามเงื่อนไขได้ เช่น อุปกรณ์ กำลังชาร์จหรือมี Wi-Fi หรือไม่

ดูข้อมูลเพิ่มเติมได้ที่คำแนะนำเกี่ยวกับการประมวลผลในเบื้องหลัง

อย่าใช้ AlarmManager เพื่อกำหนดเวลาการดำเนินการที่ใช้ได้เฉพาะขณะที่แอปกำลังทำงานอยู่ (กล่าวคือ ควรยกเลิกการดำเนินการกำหนดเวลาเมื่อผู้ใช้ออกจากแอป) ในกรณีดังกล่าว ให้ใช้คลาส Handler เนื่องจาก ใช้งานง่ายและมีประสิทธิภาพมากกว่า