Doze Mode เป็นคุณสมบัติประหยัดพลังงานของ Android ที่เปิดตัวในเวอร์ชัน 6.0 Marshmallow ซึ่งจำกัดกิจกรรมพื้นหลังของแอปพลิเคชันอย่างมีนัยสำคัญเมื่ออุปกรณ์ไม่ได้ใช้งาน ระบบจะเปลี่ยนแอปพลิเคชันไปสู่สถานะการใช้พลังงานต่ำ โดยเลื่อนคำขอเครือข่าย การซิงโครไนซ์ และ JobScheduler เพื่อยืดอายุแบตเตอรี่ ตามการวิเคราะห์ของ Android Developers, 2025 Doze Mode สามารถเพิ่มเวลาสแตนด์บายของอุปกรณ์ได้ 2–3 เท่า ขึ้นอยู่กับรุ่นและเวอร์ชันของระบบปฏิบัติการ
ประเด็นสำคัญ
Doze Mode เป็นกลไกประหยัดพลังงานในตัวของ Android ที่ทำงานเมื่ออุปกรณ์ไม่ได้เชื่อมต่อกับที่ชาร์จ หน้าจอปิดอยู่ และผู้ใช้ไม่ได้โต้ตอบกับอุปกรณ์เป็นระยะเวลาหนึ่ง เป้าหมายของ Doze คือลดกิจกรรมพื้นหลังของแอปพลิเคชันเพื่อยืดอายุแบตเตอรี่ในโหมดสแตนด์บาย ระบบจะเลื่อน JobScheduler การซิงโครไนซ์บัญชี AlarmManager และคำขอเครือข่าย
โหมดนี้เปิดตัวใน Android 6.0 Marshmallow (API 23) และได้รับการปรับปรุงอย่างมีนัยสำคัญในเวอร์ชันต่อมา Android 7.0 Nougat ได้แนะนำเฟสที่สอง (Light Doze) ที่ทำงานเมื่ออุปกรณ์เคลื่อนที่ Android 8.0 เพิ่มข้อจำกัดเพิ่มเติมเกี่ยวกับบริการพื้นหลังที่ทำงานร่วมกับ Doze ใน Android 12+ Doze ถูกรวมเข้ากับ ระบบจัดการแบตเตอรี่ ที่อัปเดตซึ่งวิเคราะห์พฤติกรรมของผู้ใช้
สิ่งสำคัญที่ต้องเข้าใจ: Doze Mode ไม่ได้ปิดการทำงานแอปพลิเคชันทั้งหมด มันเปลี่ยนให้อยู่ในสถานะที่มีงานรอดำเนินการ แต่ไม่ยุติกระบวนการ Foreground Service พร้อมการแจ้งเตือนยังคงทำงาน การแจ้งเตือนแบบพุชลำดับความสำคัญสูง (FCM high-priority) ยังคงส่งถึง และปลุกทำงานตามกำหนด Doze มีผลเฉพาะการทำงานพื้นหลังที่ผู้ใช้ไม่เห็นหรือไม่คาดหวังในขณะนั้น
Doze Mode จะทำงานเมื่อตรงตามเงื่อนไขทั้งหมด: หน้าจอปิดมากกว่า 30 นาที (การทำงานครั้งแรก) อุปกรณ์นิ่ง (ใช้มาตรวัดความเร่ง) และไม่ได้เชื่อมต่อกับที่ชาร์จ หากผู้ใช้หยิบโทรศัพท์ขึ้นมาหรือเสียบที่ชาร์จ Doze จะถูกปิดใช้งานทันที ใน Android 7+ Light Doze จะทำงานหลังจากไม่ได้ใช้งานเพียง 5 นาที แม้ว่าอุปกรณ์จะเคลื่อนที่อยู่ก็ตาม
Doze Mode จัดการกิจกรรมพื้นหลังผ่านบริการระบบ DeviceIdleController ซึ่งวิเคราะห์สถานะของเซ็นเซอร์ หน้าจอ และที่ชาร์จ เมื่อตรงตามเงื่อนไขการทำงานทั้งหมด ระบบจะเปลี่ยนแอปพลิเคชันไปสู่โหมดสแตนด์บาย โดยจัดกลุ่มคำขอของพวกเขาเป็นหน้าต่างบำรุงรักษา ภายในหน้าต่างเหล่านี้ งานที่รอดำเนินการทั้งหมด — การเรียกเครือข่าย การซิงโครไนซ์ AlarmManager — จะถูกดำเนินการเป็นชุด
PowerManager ของระบบควบคุมว่าแอปพลิเคชันใดบ้างที่สามารถออกจาก Doze ได้ การแจ้งเตือนแบบพุชลำดับความสำคัญสูง (FCM high-priority) สามารถปลุกอุปกรณ์เพื่อส่งข้อความ ระบบจะไม่สนใจ Doze สำหรับแอปพลิเคชันที่ผู้ใช้เพิ่มไปยัง Whitelist การเพิ่มประสิทธิภาพแบตเตอรี่ แอปพลิเคชันอื่นๆ ทั้งหมดต้องรอหน้าต่างบำรุงรักษาถัดไป
ระยะเวลาของหน้าต่างบำรุงรักษาใน Deep Doze เพิ่มขึ้นแบบทวีคูณ: หน้าต่างแรกหลังจาก 1 ชั่วโมง หน้าต่างที่สองหลังจาก 2 ชั่วโมง หน้าต่างที่สามหลังจาก 4 ชั่วโมง และต่อเนื่องไปจนถึงช่วงสูงสุดที่ 12 ชั่วโมง ซึ่งหมายความว่ายิ่งอุปกรณ์อยู่ใน Doze นานเท่าใด แอปพลิเคชันก็ยิ่งทำงานพื้นหลังได้น้อยลงเท่านั้น — ประหยัดแบตเตอรี่อย่างเต็มที่
ใน Doze Mode คำขอเครือข่ายทั้งหมดจะถูกระงับจนกว่าหน้าต่างบำรุงรักษาจะเปิด ข้อยกเว้นเพียงอย่างเดียวคือ ข้อความ FCM ลำดับความสำคัญสูง (ที่มีแท็ก “high_priority” ใน payload) และสัญญาณจาก AlarmManager ที่มีแฟล็ก setAndAllowWhileIdle() หรือ setExactAndAllowWhileIdle() การเรียกเครือข่ายปกติผ่าน Retrofit, OkHttp หรือ Volley จะไม่ถูกดำเนินการจนกว่าหน้าต่างจะเปิด
Doze Mode ประกอบด้วยสองเฟส: Light Doze (หลับเบา) และ Deep Doze (หลับลึก) แต่ละเฟสมีข้อจำกัดของตัวเองและมีเกณฑ์การทำงานที่แตกต่างกัน การเข้าใจความแตกต่างระหว่างเฟสเป็นสิ่งสำคัญสำหรับนักพัฒนาที่ออกแบบงานพื้นหลังที่ทนทานต่อโหมดประหยัดพลังงาน
Light Doze จะทำงานหลังจากอุปกรณ์ไม่ได้ใช้งาน 5–30 นาที (หน้าจอปิด ไม่มีการเคลื่อนไหว) ในเฟสนี้ คำขอเครือข่ายและการซิงโครไนซ์จะถูกระงับ แต่ AlarmManager และ JobScheduler ยังคงทำงานด้วยความล่าช้าเล็กน้อย แอปพลิเคชันสามารถออกจาก Light Doze เมื่อได้รับการแจ้งเตือนแบบพุชหรือเมื่อเชื่อมต่อกับที่ชาร์จ Light Doze ไม่ต้องการความนิ่งสนิท — อุปกรณ์สามารถเคลื่อนที่ได้
Deep Doze เกิดขึ้นหลังจากไม่ได้ใช้งาน 60–90 นาที โดยอุปกรณ์นิ่ง (มาตรวัดความเร่งตรวจไม่พบการเคลื่อนไหว) ใน Deep Doze ระบบจะก้าวร้าวมากขึ้นในการเลื่อนงาน: หน้าต่างบำรุงรักษาเปิดน้อยลง (โดยมีช่วงเพิ่มขึ้นแบบทวีคูณ) AlarmManager ทำงานเฉพาะกับแฟล็ก setAndAllowWhileIdle() และ WakeLock ไม่ทำงานตามปกติ แอปพลิเคชันที่ไม่ได้อยู่ใน Whitelist จะเกือบหมดสิทธิ์ทำกิจกรรมพื้นหลัง
| พารามิเตอร์ | Light Doze | Deep Doze |
|---|---|---|
| เวลาเริ่มทำงาน | 5–30 นาที | 60–90 นาที |
| ข้อกำหนดการเคลื่อนไหว | ไม่จำเป็น | นิ่งสนิท |
| ช่วงหน้าต่าง | 10–60 นาที | 1–12 ชั่วโมง |
| AlarmManager | ทำงานด้วยความล่าช้า | เฉพาะ withAllowWhileIdle |
| เครือข่ายในหน้าต่าง | ใช้งานได้ | ใช้งานได้ |
Doze Mode กำหนดข้อจำกัดหลายประเภทที่นักพัฒนาต้องพิจารณาเมื่อออกแบบแอปพลิเคชัน การไม่สนใจข้อจำกัดเหล่านี้ทำให้งานพื้นหลังไม่ถูกดำเนินการ และผู้ใช้จะเห็นพฤติกรรมที่ไม่ถูกต้องของแอปพลิเคชัน — การอัปเดตที่ขาดหาย ข้อความที่ไม่ถูกส่ง การซิงโครไนซ์ที่ไม่สมบูรณ์
คำขอเครือข่าย ทั้งหมดจะถูกบล็อกจนกว่าหน้าต่างบำรุงรักษาจะเปิด ซึ่งรวมถึงการเรียก HTTP การเชื่อมต่อ WebSocket และการดาวน์โหลดไฟล์ ข้อยกเว้นคือข้อความ FCM ลำดับความสำคัญสูง ซึ่งผ่านช่องทางแยกของ Google Play Services ที่ไม่ขึ้นกับ Doze สำหรับการซิงโครไนซ์ข้อมูลสำคัญ ขอแนะนำให้ใช้ WorkManager กับนโยบาย NetworkType.CONNECTED
AlarmManager ใน Deep Doze จะเลื่อนปลุกทั้งหมดยกเว้นที่สร้างด้วยเมธอด setAndAllowWhileIdle() และ setExactAndAllowWhileIdle() อย่างไรก็ตาม แม้แต่เมธอดเหล่านี้ก็มีข้อจำกัด — ไม่เกิน 1 ครั้งต่อ 9 นาทีต่อแอปพลิเคชัน การปลุกแบบตรงเวลาด้วย setExact() ใน Deep Doze ไม่รับประกันการทำงานตามเวลาที่ระบุ
WakeLock ทำงานผิดปกติใน Doze Mode: ระบบไม่รักษาล็อกการปลุกสำหรับแอปพลิเคชันที่อยู่นอก Whitelist แม้ว่าแอปพลิเคชันจะได้รับ PARTIAL_WAKE_LOCK อย่างถูกต้อง เมื่อ Deep Doze เริ่มต้น ระบบอาจบังคับปล่อย วิธีเดียวที่จะรับประกันการทำงานใน Doze คือใช้ Foreground Service พร้อมการแจ้งเตือน
Whitelist ของ Doze คือรายการแอปพลิเคชันที่ระบบอนุญาตให้ทำกิจกรรมพื้นหลังในโหมดประหยัดพลังงานโดยมีข้อจำกัดน้อยที่สุด ผู้ใช้สามารถเพิ่มแอปพลิเคชันลงในรายการด้วยตนเองผ่าน การตั้งค่า → แบตเตอรี่ → การเพิ่มประสิทธิภาพแบตเตอรี่ แอปพลิเคชันระบบ ตัวเรียกใช้งาน และ Google Play Services อยู่ใน Whitelist โดยค่าเริ่มต้น
นักพัฒนาสามารถขอเพิ่มใน Whitelist ผ่านกล่องโต้ตอบระบบด้วย Intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS ซึ่งต้องได้รับสิทธิ์ REQUEST_IGNORE_BATTERY_OPTIMIZATIONS ในไฟล์ Manifest อย่างไรก็ตาม Google ไม่แนะนำให้ขอยกเว้นโดยไม่มีเหตุผลอันสมควร — แอปพลิเคชันที่ใช้ความสามารถนี้ในทางที่ผิดเสี่ยงถูกปฏิเสธเมื่อเผยแพร่บน Google Play
หากไม่มี Whitelist แอปพลิเคชันสามารถใช้ FCM ลำดับความสำคัญสูง เพื่อปลุกอุปกรณ์จาก Doze ข้อความแต่ละข้อความจะให้หน้าต่างสั้นๆ (10–30 วินาที) แก่แอปพลิเคชันเพื่อทำงาน สำหรับการดำเนินการที่ยาวนานขึ้น แอปพลิเคชันต้องเริ่ม Foreground Service ซึ่งจะทำงานต่อภายในหน้าต่างบำรุงรักษาของ Doze Google ยังมี กลไกการยกเว้นสำหรับแอปพลิเคชันบางประเภท: การนำทาง การแพทย์ การส่งข้อความ
ในการตรวจสอบว่าแอปพลิเคชันอยู่ใน Whitelist การเพิ่มประสิทธิภาพแบตเตอรี่หรือไม่ ให้ใช้เมธอด powerManager.isIgnoringBatteryOptimizations() หากเมธอดส่งคืน false แอปพลิเคชันจะอยู่ภายใต้ข้อจำกัด Doze ทั้งหมด หากส่งคืน true แอปพลิเคชันสามารถใช้ Wakelock, AlarmManager และเครือข่ายโดยไม่มีข้อจำกัดแม้ใน Deep Doze อย่างไรก็ตาม การใช้สิทธิพิเศษนี้ในทางที่ผิดจะนำไปสู่รีวิวที่ไม่ดีจากผู้ใช้
การทดสอบ พฤติกรรมของแอปพลิเคชันใน Doze Mode เป็นขั้นตอนการพัฒนาที่จำเป็น เนื่องจาก Doze อาจรบกวนการทำงานพื้นหลัง Android มีเครื่องมือบรรทัดคำสั่งผ่าน ADB สำหรับบังคับเปลี่ยนอุปกรณ์ไปยัง Light Doze และ Deep Doze การทดสอบต้องดำเนินการบนอุปกรณ์จริงหรือโปรแกรมจำลองที่มี Android 6.0+
ในการเข้าสู่ Light Doze ให้ใช้คำสั่ง adb shell dumpsys deviceidle step light สำหรับ Deep Doze — adb shell dumpsys deviceidle step deep คำสั่ง adb shell dumpsys deviceidle force-idle deep จะเปลี่ยนอุปกรณ์ไปยัง Deep Doze ทันทีโดยไม่รอหมดเวลามาตรฐาน หลังการทดสอบ ให้ออกจาก Doze ด้วยคำสั่ง adb shell dumpsys deviceidle unforce
# บังคับเข้า Light Doze
$ adb shell dumpsys deviceidle step light
# บังคับเข้า Deep Doze
$ adb shell dumpsys deviceidle step deep
# เปลี่ยนเป็น Deep Doze ทันที
$ adb shell dumpsys deviceidle force-idle deep
# ออกจาก Doze
$ adb shell dumpsys deviceidle unforce
# ดูสถานะ Doze
$ adb shell dumpsys deviceidle
หลังจากเปลี่ยนไปยัง Doze Mode ให้ตรวจสอบ: คำขอเครือข่าย ทำงานหรือไม่ (ควรถูกเลื่อน) AlarmManager ทำงานหรือไม่ ข้อความ FCM ส่งถึงหรือไม่ และงาน WorkManager ดำเนินการถูกต้องหรือไม่ WorkManager ทำงานต่อใน Doze: งานของมันถูกดำเนินการในหน้าต่างบำรุงรักษา อย่างไรก็ตาม หากงานต้องการการดำเนินการทันที ให้ระบุ setExpedited() หรือใช้ Foreground Service
การพัฒนาแอปพลิเคชันที่ทนทานต่อ Doze Mode จำเป็นต้องทบทวนแนวทางต่องานพื้นหลัง Google แนะนำให้ออกแบบแอปพลิเคชันให้ทำงานอย่างถูกต้องภายใต้ข้อจำกัด Doze ใดๆ โดยไม่พึ่งพาการดำเนินการทันทีของงานพื้นหลัง หลักการพื้นฐานคือใช้ WorkManager สำหรับงานพื้นหลังทั้งหมดที่สามารถเลื่อนได้
WorkManager เป็น API ที่ Google แนะนำสำหรับงานพื้นหลังเนื่องจากปรับตัวเข้ากับ Doze โดยอัตโนมัติ WorkManager ใช้ JobScheduler (API 23+) หรือ AlarmManager + BroadcastReceiver ในเวอร์ชันเก่า งาน WorkManager จะถูกดำเนินการในหน้าต่างบำรุงรักษา Doze ที่ใกล้ที่สุด หรือทันทีหากจำเป็นผ่าน Expedited Work (Foreground Service ภายใต้ฝาครอบ)
หากงานไม่สามารถเลื่อนได้ (การเล่นสื่อ การนำทาง VoIP) ให้ใช้ Foreground Service พร้อมการแจ้งเตือนที่จำเป็น Foreground Service ได้รับการยกเว้นจาก Doze: สามารถรักษา WakeLock และดำเนินการคำขอเครือข่าย อย่างไรก็ตาม แม้แต่ Foreground Service ก็ยังอยู่ภายใต้นโยบายหน้าต่างบำรุงรักษาของ Deep Doze สำหรับงานบางประเภท — ตัวอย่างเช่น dataSync
สำหรับการส่งข้อความที่ต้องการความสนใจทันที (สายเรียกเข้า การแจ้งเตือนเร่งด่วน) ให้ใช้ข้อความ FCM ลำดับความสำคัญสูง ข้อความเหล่านี้จะปลุกอุปกรณ์จาก Doze และให้หน้าต่างสั้นๆ แก่แอปพลิเคชันสำหรับการประมวลผล อย่าใช้ลำดับความสำคัญสูงสำหรับการแจ้งเตือนปกติ — ซึ่งจะทำให้แบตเตอรี่หมดเร็วและอาจถูกถือว่าละเมิดนโยบายของ Google Play
คำถามที่พบบ่อย
Doze Mode คือโหมดประหยัดพลังงาน Android 6+ ที่จำกัดกิจกรรมพื้นหลังของแอปพลิเคชันเมื่ออุปกรณ์ไม่ได้ใช้งาน (หน้าจอปิด ไม่มีการเคลื่อนไหว) ระบบจะเลื่อนคำขอเครือข่าย การซิงโครไนซ์ และ JobScheduler โดยจัดกลุ่มเป็นหน้าต่างบำรุงรักษาเพื่อประหยัดแบตเตอรี่
Doze Mode มีสองเฟส: Light Doze (หลับเบา) ทำงานหลังจาก 5–30 นาที และให้ AlarmManager ทำงานด้วยความล่าช้า Deep Doze (หลับลึก) เกิดขึ้นหลังจากนิ่ง 60–90 นาที จำกัดงานพื้นหลังอย่างก้าวร้าวด้วยหน้าต่างบำรุงรักษาสูงสุด 12 ชั่วโมง
Doze บล็อกคำขอเครือข่าย เลื่อน AlarmManager (ยกเว้น setAndAllowWhileIdle) บังคับปล่อย WakeLock และจัดกลุ่ม JobScheduler ในหน้าต่างบำรุงรักษา ข้อยกเว้นรวมถึง Foreground Service, FCM ลำดับความสำคัญสูง และแอปพลิเคชันใน Whitelist ของผู้ใช้
ขอสิทธิ์ REQUEST_IGNORE_BATTERY_OPTIMIZATIONS ในไฟล์ Manifest และส่ง Intent ด้วยการดำเนินการ ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS ระบบจะแสดงกล่องโต้ตอบให้ผู้ใช้ การเพิ่มใน Whitelist เป็นสิทธิพิเศษที่ Google แนะนำให้ใช้เฉพาะแอปพลิเคชันที่สำคัญอย่างยิ่ง
ใช้คำสั่ง ADB: adb shell dumpsys deviceidle force-idle deep เพื่อเข้าสู่ Deep Doze, adb shell dumpsys deviceidle step light สำหรับ Light Doze, adb shell dumpsys deviceidle unforce เพื่อออก ตรวจสอบ WorkManager, AlarmManager และ FCM ในแต่ละโหมด
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ