ปลุกระบบบ่อยเกินไป
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
การปลุกระบบเป็นกลไกใน
AlarmManager
API ที่
อนุญาตให้นักพัฒนาแอปตั้งปลุกเพื่อปลุกระบบของอุปกรณ์ในเวลาที่ระบุ แอปของคุณ
ตั้งปลุกโดยโทรหาหนึ่งในวิธี set()
ใน
AlarmManager
ด้วย
อย่างใดอย่างหนึ่ง
RTC_WAKEUP
หรือ
ELAPSED_REALTIME_WAKEUP
แจ้ง เมื่อมีการปลุกให้ตื่นนอน อุปกรณ์จะออกจากโหมดพลังงานต่ำ
และมีการเปิดล็อกบางส่วนไว้ในขณะที่เรียกใช้
onReceive()
หรือ
onAlarm()
หากการปลุกระบบทำงานมากเกินไป อาจทำให้อุปกรณ์หมดเปลือก
แบตเตอรี่
Android จะตรวจสอบแอปโดยอัตโนมัติเพื่อหา
การปลุกระบบบ่อยเกินไปและแสดงข้อมูลใน Android Vitals สำหรับ
เกี่ยวกับวิธีรวบรวมข้อมูลได้ที่ Play Console
เอกสาร
หากแอปปลุกอุปกรณ์มากเกินไป คุณสามารถใช้คำแนะนำใน
หน้านี้เพื่อวิเคราะห์และแก้ไขปัญหา
แก้ไขปัญหา
AlarmManager
เดิมคือ
เปิดตัวบนแพลตฟอร์ม Android เวอร์ชันแรกๆ แต่เมื่อเวลาผ่านไป
กรณีที่ก่อนหน้านี้ต้องใช้
AlarmManager
เปลี่ยนเป็น
ที่ให้บริการได้ดียิ่งขึ้นด้วยฟีเจอร์ใหม่ๆ เช่น
WorkManager
ส่วนนี้ประกอบด้วยเคล็ดลับสำหรับการลดการปลุกระบบ แต่ในระยะยาว
ให้ลองย้ายแอปของคุณตามคำแนะนำในหัวข้อ
แนวทางปฏิบัติแนะนำ
ระบุตำแหน่งในแอปที่คุณตั้งเวลาปลุกให้ตื่นนอนและลด
ความถี่ที่การปลุกนั้นเกิดขึ้น โดยมีเคล็ดลับดังนี้
มองหาการโทรไปยัง
set()
ใน
AlarmManager
ที่
รวมถึง
RTC_WAKEUP
หรือ
ELAPSED_REALTIME_WAKEUP
แจ้ง
เราขอแนะนำให้ใส่ชื่อแพ็กเกจ คลาส หรือชื่อวิธีการในแท็กการปลุก
เพื่อระบุตำแหน่งในแหล่งข้อมูลที่มี
ตั้งนาฬิกาปลุกแล้ว เคล็ดลับเพิ่มเติมมีดังนี้
- อย่าใส่ข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ (PII) ไว้ในชื่อ เช่น
ที่อยู่อีเมล ไม่เช่นนั้น อุปกรณ์จะบันทึก
_UNKNOWN
แทนการปลุก
ชื่อ
- ไม่ได้รับชื่อคลาสหรือเมธอดแบบเป็นโปรแกรม เช่น ด้วยการเรียก
getName()
เนื่องจาก
อาจถูกสร้างความสับสนโดย Proguard โปรดใช้สตริงฮาร์ดโค้ดแทน
- อย่าเพิ่มตัวนับหรือตัวระบุที่ไม่ซ้ำกันลงในแท็กการปลุก ระบบจะไม่ดำเนินการต่อไปนี้
จะสามารถรวบรวมการตั้งปลุกในลักษณะดังกล่าว เพราะทุกคนต่างมี
ตัวระบุที่ไม่ซ้ำกัน
หลังจากแก้ปัญหาแล้ว ให้ตรวจสอบว่าการปลุกด้วยนาฬิกาปลุกทำงานตาม
โดยการเรียกใช้ ADB ต่อไปนี้
คำสั่ง:
adb shell dumpsys alarm
คำสั่งนี้จะให้ข้อมูลเกี่ยวกับสถานะของบริการระบบสัญญาณเตือน
ในอุปกรณ์ สำหรับข้อมูลเพิ่มเติม โปรดดู
dumpsys
แนวทางปฏิบัติแนะนำ
ใช้การปลุกระบบเฉพาะเมื่อแอปของคุณต้องทำงานที่แสดงต่อผู้ใช้เท่านั้น
(เช่น การโพสต์การแจ้งเตือนหรือการแจ้งเตือนผู้ใช้) สำหรับรายการ
แนวทางปฏิบัติแนะนำสำหรับ Alarm Manager โปรดดูที่การตั้งเวลา
การปลุก
ไม่ใช้
AlarmManager
ถึง
กำหนดเวลางานในเบื้องหลัง โดยเฉพาะงานที่ทำซ้ำหรืองานเบื้องหลังของเครือข่าย ใช้
WorkManager
ตั้งเวลางานในเบื้องหลังได้ เนื่องจากมีประโยชน์ดังต่อไปนี้
- การทำงานแบบกลุ่ม - รวมงานเข้าด้วยกันเพื่อให้ใช้แบตเตอรี่ลดลง
- การคงอยู่ - หากอุปกรณ์รีบูต งาน WorkManager ที่กำหนดเวลาไว้
ทำงานหลังจากการรีบูตเสร็จสิ้น
- เกณฑ์ - งานสามารถทำงานได้ตามเงื่อนไข เช่น ระบุว่าอุปกรณ์หรือไม่
กำลังชาร์จอยู่หรือ Wi-Fi พร้อมใช้งาน
ดูข้อมูลเพิ่มเติมได้ที่คำแนะนำเกี่ยวกับการประมวลผลในเบื้องหลัง
ไม่ใช้ AlarmManager
เพื่อกำหนดเวลาการดำเนินการซึ่งจะใช้ได้ก็ต่อเมื่อแอปทำงานอยู่ (ใน
กล่าวคือ การดำเนินการการจับเวลาควรถูกยกเลิกเมื่อผู้ใช้ออกจาก
แอป) ในสถานการณ์เหล่านั้น ให้ใช้
Handler
เนื่องจาก
ใช้งานง่ายและมีประสิทธิภาพมากขึ้น
แนะนำสำหรับคุณ
ตัวอย่างเนื้อหาและโค้ดในหน้าเว็บนี้ขึ้นอยู่กับใบอนุญาตที่อธิบายไว้ในใบอนุญาตการใช้เนื้อหา Java และ OpenJDK เป็นเครื่องหมายการค้าหรือเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-07-27 UTC
[[["เข้าใจง่าย","easyToUnderstand","thumb-up"],["แก้ปัญหาของฉันได้","solvedMyProblem","thumb-up"],["อื่นๆ","otherUp","thumb-up"]],[["ไม่มีข้อมูลที่ฉันต้องการ","missingTheInformationINeed","thumb-down"],["ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป","tooComplicatedTooManySteps","thumb-down"],["ล้าสมัย","outOfDate","thumb-down"],["ปัญหาเกี่ยวกับการแปล","translationIssue","thumb-down"],["ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด","samplesCodeIssue","thumb-down"],["อื่นๆ","otherDown","thumb-down"]],["อัปเดตล่าสุด 2025-07-27 UTC"],[],[],null,["# Excessive wakeups\n\nWakeups are a mechanism in the\n[`AlarmManager`](/reference/android/app/AlarmManager) API that\nlets developers set an alarm to wake up a device at a specified time. Your app\nsets a wakeup alarm by calling one of the `set()` methods in\n[`AlarmManager`](/reference/android/app/AlarmManager) with\neither the\n[`RTC_WAKEUP`](/reference/android/app/AlarmManager#RTC_WAKEUP)\nor\n[`ELAPSED_REALTIME_WAKEUP`](/reference/android/app/AlarmManager#ELAPSED_REALTIME_WAKEUP)\nflag. When a wakeup alarm is triggered, the device comes out of low-power mode\nand holds a [partial wake lock](/topic/performance/vitals/wakelock) while executing the alarm's\n[`onReceive()`](/reference/android/content/BroadcastReceiver#onReceive(android.content.Context,%20android.content.Intent))\nor\n[`onAlarm()`](/reference/android/app/AlarmManager.OnAlarmListener#onAlarm())\nmethod. If wakeup alarms are triggered excessively, they can drain a device's\nbattery.\n\nTo help you improve app quality, Android automatically monitors apps for\nexcessive wakeup alarms and displays the information in Android vitals. For\ninformation on how the data is collected, see [Play Console\ndocs](https://support.google.com/googleplay/android-developer/answer/7385505).\n\nIf your app is waking up the device excessively, you can use the guidance in\nthis page to diagnose and fix the problem.\n\nFix the problem\n---------------\n\nThe [`AlarmManager`](/reference/android/app/AlarmManager) was\nintroduced in early versions of the Android platform, but over time, many use\ncases that previously required\n[`AlarmManager`](/reference/android/app/AlarmManager) are now\nbetter served by newer features like\n[WorkManager](/topic/libraries/architecture/workmanager).\nThis section contains tips for reducing wake up alarms, but in the long term,\nconsider migrating your app to follow the recommendations in the [best\npractices](#best_practices) section.\n\nIdentify the places in your app where you schedule wakeup alarms and reduce\nthe frequency that those alarms are triggered. Here are some tips:\n\n- Look for calls to the various\n [`set()`](/reference/android/app/AlarmManager#set(int,%20long,%20java.lang.String,%20android.app.AlarmManager.OnAlarmListener,%20android.os.Handler))\n methods in\n [`AlarmManager`](/reference/android/app/AlarmManager) that\n include either the\n [`RTC_WAKEUP`](/reference/android/app/AlarmManager#RTC_WAKEUP)\n or\n [`ELAPSED_REALTIME_WAKEUP`](/reference/android/app/AlarmManager#ELAPSED_REALTIME_WAKEUP)\n flag.\n\n- We recommend including your package, class, or method name in your alarm's tag\n name so that you can easily identify the location in your source where the\n alarm was set. Here are some additional tips:\n\n - Leave out any personally identifying information (PII) in the name, such as an email address. Otherwise, the device logs `_UNKNOWN` instead of the alarm name.\n - Don't get the class or method name programmatically, for example by calling [`getName()`](/reference/java/lang/Class#getName()), because it could get obfuscated by Proguard. Instead use a hard-coded string.\n - Don't add a counter or unique identifiers to alarm tags. The system will not be able to aggregate alarms that are set that way because they all have unique identifiers.\n\nAfter fixing the problem, verify that your wakeup alarms are working as\nexpected by running the following [ADB](/studio/command-line/adb)\ncommand: \n\n adb shell dumpsys alarm\n\nThis command provides information about the status of the alarm system service\non the device. For more information, see\n[dumpsys](https://source.android.com/devices/tech/debug/dumpsys).\n\nBest practices\n--------------\n\nUse wakeup alarms only if your app needs to perform a user facing operation\n(such as posting a notification or alerting the user). For a list of\nAlarmManager best practices, see [Scheduling\nAlarms](/training/scheduling/alarms).\n\nDon't use\n[`AlarmManager`](/reference/android/app/AlarmManager) to\nschedule background tasks, especially repeating or network background tasks. Use\n[WorkManager](/topic/libraries/architecture/workmanager)\nto schedule background tasks because it offers the following benefits:\n\n- batching - jobs are combined so that battery consumption is reduced\n- persistence - if the device is rebooted, scheduled WorkManager jobs run after the reboot finishes\n- criteria - jobs can run based on conditions, such as whether or not the device is charging or WiFi is available\n\nFor more information, see [Guide to background processing](/guide/background).\n\nDon't use [`AlarmManager`](/reference/android/app/AlarmManager)\nto schedule timing operations that are valid only while the app is running (in\nother words, the timing operation should be canceled when the user exits the\napp). In those situations, use the\n[`Handler`](/reference/android/os/Handler) class because it is\neasier to use and much more efficient.\n\nRecommended for you\n-------------------\n\n- Note: link text is displayed when JavaScript is off\n- [Stuck partial wake locks](/topic/performance/vitals/wakelock)\n- [ANRs](/topic/performance/vitals/anr)"]]