Android มีฟีเจอร์ประหยัดพลังงาน 2 ฟีเจอร์ที่ช่วยยืดอายุการใช้งานแบตเตอรี่ให้ผู้ใช้ด้วยการจัดการลักษณะการทำงานของแอปเมื่ออุปกรณ์ไม่ได้เชื่อมต่อกับแหล่งจ่ายไฟ ได้แก่ โหมดสลีปและสแตนด์บายแอป Doze ช่วยลดการใช้แบตเตอรี่โดยเลื่อนเวลาการทำงานของ CPU และกิจกรรมเครือข่ายในเบื้องหลังสำหรับแอปเมื่อไม่ได้ใช้อุปกรณ์เป็นเวลานาน สแตนด์บายแอปจะเลื่อนกิจกรรมเครือข่ายในเบื้องหลังสำหรับแอปที่ไม่มีกิจกรรมของผู้ใช้เมื่อเร็วๆ นี้
ขณะที่อุปกรณ์อยู่ในโหมด Doze สิทธิ์ของแอปในการเข้าถึงทรัพยากรบางอย่างที่ใช้แบตเตอรี่มากจะถูกเลื่อนออกไปจนกว่าจะถึงช่วงเวลาบำรุงรักษา ข้อจำกัดที่เฉพาะเจาะจงจะแสดงอยู่ในข้อจำกัดด้านการจัดการพลังงาน
โหมด Doze และสแตนด์บายแอปจะจัดการลักษณะการทำงานของแอปทั้งหมดที่ทำงานใน Android 6.0 ขึ้นไป ไม่ว่าแอปเหล่านั้นจะกำหนดเป้าหมายเป็น API ระดับ 23 โดยเฉพาะหรือไม่ก็ตาม เพื่อช่วยให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีที่สุด ให้ทดสอบแอปในโหมด Doze และโหมดสแตนด์บายแอป แล้วทำการปรับเปลี่ยนโค้ดที่จำเป็น ส่วนต่อไปนี้จะให้รายละเอียด
ทำความเข้าใจโหมด Doze
หากผู้ใช้ถอดปลั๊กอุปกรณ์และวางไว้เฉยๆ เป็นระยะเวลาหนึ่งโดยปิดหน้าจอ อุปกรณ์จะเข้าสู่โหมด Doze ในโหมด Doze ระบบจะพยายามประหยัดแบตเตอรี่โดยจำกัดการเข้าถึงเครือข่ายและบริการที่ใช้ CPU มากของแอป นอกจากนี้ยังป้องกันไม่ให้แอปเข้าถึงเครือข่ายและเลื่อนงาน การซิงค์ และการปลุกมาตรฐานออกไป
ระบบจะออกจากโหมด Doze เป็นระยะๆ เป็นเวลาสั้นๆ เพื่อให้แอปทำกิจกรรมที่เลื่อนออกไปให้เสร็จสมบูรณ์ ในระหว่างช่วงเวลาบำรุงรักษานี้ ระบบจะเรียกใช้การซิงค์ งาน และการปลุกที่รอดำเนินการทั้งหมด และอนุญาตให้แอปเข้าถึงเครือข่ายได้
เมื่อช่วงเวลาบำรุงรักษาสิ้นสุดลง ระบบจะเข้าสู่โหมด Doze อีกครั้ง โดยจะระงับการเข้าถึงเครือข่ายและเลื่อนงาน การซิงค์ และการปลุกออกไป เมื่อเวลาผ่านไป ระบบจะกำหนดเวลาช่วงเวลาบำรุงรักษาน้อยลง ซึ่งจะช่วยลดการใช้แบตเตอรี่ในกรณีที่ไม่มีการใช้งานเป็นเวลานานเมื่ออุปกรณ์ไม่ได้ชาร์จอยู่
เมื่อผู้ใช้ปลุกอุปกรณ์ด้วยการขยับ เปิดหน้าจอ หรือเชื่อมต่อที่ชาร์จ ระบบจะออกจากโหมด Doze และแอปทั้งหมดจะกลับมาทำงานตามปกติ
ข้อจำกัดของโหมด Doze
ระบบจะใช้ข้อจำกัดต่อไปนี้กับแอปของคุณขณะอยู่ในโหมด Doze
- ระงับการเข้าถึงเครือข่าย
- โดยไม่สนใจ Wake Lock
- เลื่อนการแจ้งเตือนมาตรฐาน
AlarmManagerซึ่งรวมถึงsetExact()และsetWindow()ไปยังช่วงเวลาบำรุงรักษาถัดไป- หากต้องการตั้งการปลุกที่เริ่มทำงานขณะอยู่ในโหมด Doze ให้ใช้
setAndAllowWhileIdle()หรือsetExactAndAllowWhileIdle() - การปลุกที่ตั้งค่าด้วย
setAlarmClock()จะยังคงทำงานตามปกติ ระบบจะออกจากโหมด Doze ไม่นานก่อนที่การปลุกเหล่านั้นจะเริ่มทำงาน
- หากต้องการตั้งการปลุกที่เริ่มทำงานขณะอยู่ในโหมด Doze ให้ใช้
- ไม่สแกนหา Wi-Fi
- ไม่อนุญาตให้อะแดปเตอร์การซิงค์ทำงาน
- ไม่อนุญาตให้
JobSchedulerทำงาน
รายการตรวจสอบ Doze
- หากเป็นไปได้ ให้ใช้ Firebase Cloud Messaging (FCM) สำหรับการรับส่งข้อความดาวน์สตรีม
- หากผู้ใช้ต้องเห็นการแจ้งเตือนทันที ให้ใช้ประเภทข้อความ
RemoteNotificationดูคำแนะนำเพิ่มเติมได้ที่ เอกสารประกอบของ FCM เกี่ยวกับประเภทข้อความRemoteNotification - ระบุข้อมูลที่เพียงพอภายในเพย์โหลดข้อความเริ่มต้น เพื่อให้ไม่จำเป็นต้องเข้าถึงเครือข่ายในภายหลัง
- ตั้งค่าการปลุกที่สำคัญด้วย
setAndAllowWhileIdle()และsetExactAndAllowWhileIdle() - ทดสอบแอปในโหมด Doze
ปรับแอปให้เข้ากับโหมด Doze
โหมด Doze อาจส่งผลต่อแอปแตกต่างกันไป โดยขึ้นอยู่กับความสามารถที่แอปมีและบริการที่แอปใช้ แอปจำนวนมากทำงานได้ตามปกติในรอบ Doze โดยไม่ต้องมีการแก้ไข ในบางกรณี คุณต้องเพิ่มประสิทธิภาพวิธีที่แอปจัดการเครือข่าย การปลุก งาน และการซิงค์ แอปต้องสามารถจัดการกิจกรรมได้อย่างมีประสิทธิภาพในช่วงเวลาบำรุงรักษาแต่ละช่วง
คุณสามารถใช้วิธีการ 2 วิธีเพื่อช่วยในการตั้งเวลาปลุก AlarmManager
ได้แก่ setAndAllowWhileIdle() และ
setExactAndAllowWhileIdle() เมื่อใช้วิธีเหล่านี้ คุณจะตั้งการปลุกที่เริ่มทำงานได้แม้ว่าอุปกรณ์จะอยู่ในโหมด Doze
ข้อจำกัดของโหมด Doze ในการเข้าถึงเครือข่ายก็มีแนวโน้มที่จะส่งผลต่อแอปของคุณเช่นกัน โดยเฉพาะอย่างยิ่งหากแอปอาศัยข้อความแบบเรียลไทม์ เช่น การแจ้งเตือนหรือการแจ้งเตือน หากแอปของคุณต้องเชื่อมต่อกับเครือข่ายอย่างต่อเนื่องเพื่อรับข้อความ ให้ใช้ Firebase Cloud Messaging (FCM) หากเป็นไปได้
หากต้องการยืนยันว่าแอปทำงานตามที่คาดไว้กับโหมด Doze คุณสามารถใช้คำสั่ง adb เพื่อบังคับให้ระบบเข้าและออกจากโหมด Doze และสังเกตลักษณะการทำงานของแอปได้ ดูรายละเอียดได้ที่ทดสอบด้วยโหมด Doze และสแตนด์บายแอป
ทำความเข้าใจเกี่ยวกับสแตนด์บายแอป
สแตนด์บายแอปช่วยให้ระบบระบุได้ว่าแอปไม่มีการใช้งานเมื่อผู้ใช้ไม่ได้ใช้งานแอปนั้นอยู่ ระบบจะพิจารณาเมื่อผู้ใช้ไม่ได้แตะแอปเป็นระยะเวลาหนึ่งและไม่มีเงื่อนไขต่อไปนี้ที่ตรงกัน
- ผู้ใช้เปิดแอปอย่างชัดแจ้ง
- แอปมีกระบวนการที่ทำงานอยู่เบื้องหน้าในปัจจุบัน ไม่ว่าจะเป็นกิจกรรมหรือบริการที่ทำงานอยู่เบื้องหน้า หรือมีการใช้งานโดยกิจกรรมหรือบริการที่ทำงานอยู่เบื้องหน้าอื่น
- แอปจะสร้างการแจ้งเตือนที่ผู้ใช้เห็นในหน้าจอล็อกหรือในถาดการแจ้งเตือน
เมื่อผู้ใช้เสียบอุปกรณ์เข้ากับแหล่งจ่ายไฟ ระบบจะปลดแอปออกจากสถานะสแตนด์บาย เพื่อให้แอปเข้าถึงเครือข่ายได้อย่างอิสระ รวมถึงเรียกใช้งานและซิงค์ที่รอดำเนินการอยู่ หากอุปกรณ์ไม่มีการใช้งานเป็นเวลานาน ระบบจะอนุญาตให้แอปที่ไม่มีการใช้งานเข้าถึงเครือข่ายได้ประมาณวันละครั้ง
ใช้ FCM เพื่อโต้ตอบกับแอปขณะที่อุปกรณ์ไม่มีการใช้งาน
Firebase Cloud Messaging (FCM) เป็นบริการจากระบบคลาวด์ไปยังอุปกรณ์ที่ช่วยให้คุณรองรับการรับส่งข้อความดาวน์สตรีมแบบเรียลไทม์ระหว่างบริการแบ็กเอนด์และแอปในอุปกรณ์ Android FCM ให้การเชื่อมต่อกับระบบคลาวด์แบบถาวรเพียงรายการเดียว แอปทั้งหมดที่ต้องการการรับส่งข้อความแบบเรียลไทม์สามารถแชร์การเชื่อมต่อนี้ได้ การเชื่อมต่อที่ใช้ร่วมกันนี้ช่วยเพิ่มประสิทธิภาพการใช้แบตเตอรี่ได้อย่างมาก เนื่องจากแอปหลายแอปไม่จำเป็นต้องรักษาการเชื่อมต่อแบบถาวรแยกต่างหาก ซึ่งอาจทำให้แบตเตอรี่หมดเร็ว ด้วยเหตุนี้ หากแอปของคุณต้องมีการผสานรวมการรับส่งข้อความกับบริการแบ็กเอนด์ เราขอแนะนำอย่างยิ่งให้ใช้ FCM หากเป็นไปได้ แทนที่จะรักษาการเชื่อมต่อเครือข่ายแบบถาวรของคุณเอง
FCM ได้รับการเพิ่มประสิทธิภาพให้ทำงานร่วมกับโหมด Doze และโหมดสแตนด์บายแอปที่ไม่มีการใช้งาน ข้อความ FCM ประเภท RemoteNotification ช่วยให้คุณปลุกแอปเพื่อดึงดูดผู้ใช้ได้ ในโหมด Doze หรือสแตนด์บายแอป ระบบจะส่งข้อความและให้สิทธิ์แอปเข้าถึงบริการเครือข่ายและ Wake Lock บางส่วนชั่วคราว จากนั้นจะทำให้อุปกรณ์หรือแอปกลับสู่สถานะไม่มีการใช้งาน สำหรับการแจ้งเตือนที่ผู้ใช้มองเห็นได้และมีความสำคัญด้านเวลา ให้พิจารณาใช้ประเภทข้อความ RemoteNotification เพื่อเปิดใช้การนำส่งในโหมด Doze ข้อความเหล่านี้อาจส่งผลให้เกิดการแจ้งเตือน ดูข้อมูลเพิ่มเติมได้ที่
คำแนะนำของ FCM เกี่ยวกับ RemoteNotification
สำหรับข้อความที่ไม่ส่งผลให้เกิดการแจ้งเตือน เช่น การอัปเดตเนื้อหาแอปในเบื้องหลังหรือการเริ่มซิงค์ข้อมูล ให้ใช้ข้อความ FCM BackgroundSync ข้อความเหล่านี้มีลำดับความสำคัญต่ำโดยเจตนา และอาจล่าช้าหรือถูกจำกัดเพื่อเพิ่มประสิทธิภาพแบตเตอรี่ของอุปกรณ์
แนวทางปฏิบัติแนะนำทั่วไปคือ หากแอปของคุณต้องการการรับส่งข้อความดาวน์สตรีม ให้ใช้ FCM หากแอปของคุณใช้ FCM อยู่แล้ว ให้ตรวจสอบว่าแอปใช้ RemoteNotification สำหรับข้อความที่ส่งผลให้เกิดการแจ้งเตือนที่แสดงต่อผู้ใช้
อย่าใช้ RemoteNotification ในสถานการณ์ต่อไปนี้
- เมื่อระบบจะไม่แสดงการแจ้งเตือนอย่างแน่นอน
- สำหรับการส่งข้อความที่อัปเดตสถานะแอปเท่านั้นในทันที เช่น การอัปเดตเนื้อหาแอปให้เป็นปัจจุบันอยู่เสมอในเบื้องหลังหรือการเริ่มซิงค์ข้อมูล
- เป็นวิธีการแจ้งให้ผู้ใช้ปลายทางให้สิทธิ์
การสนับสนุนสำหรับกรณีการใช้งานอื่นๆ
แอปเกือบทั้งหมดรองรับโหมด Doze ได้โดยการจัดการการเชื่อมต่อเครือข่าย การปลุก งาน และการซิงค์ รวมถึงการใช้ข้อความ FCM สำหรับกรณีการใช้งานที่จำกัด วิธีนี้อาจไม่เพียงพอ ในกรณีเช่นนี้ ระบบจะแสดงรายการแอปที่กำหนดค่าได้ซึ่งได้รับการยกเว้นบางส่วนจากการเพิ่มประสิทธิภาพ Doze และสแตนด์บายแอป
แอปที่ได้รับการยกเว้นบางส่วนจะใช้เครือข่ายและคง Wake Lock บางส่วนไว้ได้ในระหว่างที่อยู่ในโหมด Doze และสแตนด์บายแอป อย่างไรก็ตาม ข้อจำกัดอื่นๆ จะยังคงมีผลกับแอปนี้เช่นเดียวกับแอปอื่นๆ ตัวอย่างเช่น งานและการซิงค์ของแอปจะเลื่อนออกไปในระดับ API 23 ลงไป และการปลุก AlarmManager ตามปกติจะไม่เริ่มทำงาน แอปสามารถตรวจสอบได้ว่าปัจจุบันอยู่ในรายการที่ยกเว้นหรือไม่โดยเรียกใช้ isIgnoringBatteryOptimizations()
ผู้ใช้สามารถกำหนดค่ารายการแอปที่ได้รับการยกเว้นด้วยตนเองได้ในการตั้งค่า > แบตเตอรี่ > การเพิ่มประสิทธิภาพแบตเตอรี่ หรือระบบจะให้วิธีที่แอปสามารถขอให้ผู้ใช้ยกเว้นแอปได้ ดังนี้
- แอปส่วนใหญ่สามารถเรียกใช้ Intent ที่มี
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGSได้ - แอปที่เป็นไปตามกรณีการใช้งานที่ยอมรับได้สามารถเรียกใช้ Intent ที่มีการดำเนินการตาม Intent
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSเพื่อให้ผู้ใช้เพิ่มแอปลงในรายการที่ยกเว้นได้โดยตรงโดยไม่ต้องไปที่การตั้งค่าระบบ
แอปสามารถตรวจสอบว่าตนเองอยู่ในรายการที่ยกเว้นหรือไม่โดยเรียกใช้ isIgnoringBatteryOptimizations()
ทดสอบด้วยโหมด Doze และสแตนด์บายแอป
เพื่อช่วยให้มั่นใจว่าผู้ใช้จะได้รับประสบการณ์ที่ยอดเยี่ยม ให้ทดสอบแอปอย่างเต็มรูปแบบในโหมด Doze และสแตนด์บายแอป
ทดสอบแอปด้วยโหมด Doze
คุณทดสอบโหมด Doze ได้โดยทำดังนี้
- กำหนดค่าอุปกรณ์ฮาร์ดแวร์หรืออุปกรณ์เสมือนจริงด้วยอิมเมจระบบ Android 6.0 (API ระดับ 23) ขึ้นไป
- เชื่อมต่ออุปกรณ์กับคอมพิวเตอร์สำหรับการพัฒนาซอฟต์แวร์และติดตั้งแอป
- เรียกใช้แอปและปล่อยให้แอปทำงานอยู่
- บังคับให้ระบบเข้าสู่โหมดไม่มีการใช้งานโดยเรียกใช้คำสั่งต่อไปนี้
$ adb shell dumpsys deviceidle force-idle - เมื่อพร้อมแล้ว ให้ออกจากโหมดไม่มีการใช้งานโดยเรียกใช้คำสั่งต่อไปนี้
$ adb shell dumpsys deviceidle unforce - เปิดใช้งานอุปกรณ์อีกครั้งโดยใช้คำสั่งต่อไปนี้
$ adb shell dumpsys battery reset - สังเกตลักษณะการทำงานของแอปหลังจากเปิดใช้งานอุปกรณ์อีกครั้ง ตรวจสอบว่าแอปกลับมาทำงานได้อย่างราบรื่นเมื่ออุปกรณ์ออกจากโหมด Doze
ทดสอบแอปด้วยสแตนด์บายแอป
หากต้องการทดสอบโหมดสแตนด์บายแอปกับแอปของคุณ ให้ทำดังนี้
- กำหนดค่าอุปกรณ์ฮาร์ดแวร์หรืออุปกรณ์เสมือนจริงด้วยอิมเมจระบบ Android 6.0 (API ระดับ 23) ขึ้นไป
- เชื่อมต่ออุปกรณ์กับคอมพิวเตอร์สำหรับการพัฒนาซอฟต์แวร์และติดตั้งแอป
- เรียกใช้แอปและปล่อยให้แอปทำงานอยู่
- บังคับให้แอปเข้าสู่โหมดสแตนด์บายแอปโดยเรียกใช้คำสั่งต่อไปนี้
$ adb shell dumpsys battery unplug $ adb shell am set-inactive <packageName> true - จำลองการปลุกแอปโดยใช้คำสั่งต่อไปนี้
$ adb shell am set-inactive <packageName> false $ adb shell am get-inactive <packageName> - สังเกตลักษณะการทำงานของแอปหลังจากปลุกให้ทำงาน ตรวจสอบว่าแอปกลับมาทำงานได้อย่างราบรื่นจากโหมดสแตนด์บาย โดยเฉพาะอย่างยิ่ง ให้ตรวจสอบว่าการแจ้งเตือนและงานเบื้องหลังของแอปทำงานตามที่คาดไว้หรือไม่
กรณีการใช้งานที่ยอมรับได้สำหรับการยกเว้น
ตารางต่อไปนี้แสดงกรณีการใช้งานหลายกรณีและระบุว่าแอปสามารถใช้การดำเนินการตาม Intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS ในสถานการณ์เหล่านี้ได้หรือไม่ โดยทั่วไปแล้ว แอปของคุณจะไม่เป็นไปตามข้อยกเว้นเหล่านี้ เว้นแต่ว่าโหมด Doze หรือสแตนด์บายแอปจะทำให้ฟังก์ชันหลักของแอปเสียหาย หรือมีเหตุผลทางเทคนิคที่ทำให้แอปใช้ข้อความ FCM RemoteNotification ไม่ได้
ดูข้อมูลเพิ่มเติมได้ที่การสนับสนุนสำหรับกรณีการใช้งานอื่นๆ
| ประเภท | กรณีการใช้งาน | ใช้ FCM ได้ไหม | การยกเว้นเป็นที่ยอมรับไหม | หมายเหตุ |
|---|---|---|---|---|
| แอปการรับส่งข้อความโต้ตอบแบบทันที แชท หรือแอปการโทร | ต้องส่งข้อความแบบเรียลไทม์ให้ผู้ใช้ขณะที่อุปกรณ์อยู่ในโหมด Doze หรือแอปอยู่ในโหมดสแตนด์บายแอป | ใช่ โดยใช้ FCM | ไม่ยอมรับ | ใช้ข้อความ FCM RemoteNotification เพื่อปลุกแอปและเข้าถึงเครือข่าย |
ใช่ แต่ไม่ได้ใช้ข้อความ FCM RemoteNotification |
||||
| แอปการรับส่งข้อความโต้ตอบแบบทันที แชท หรือแอปการโทร แอป VOIP สำหรับองค์กร | ไม่ ไม่สามารถใช้ FCM ได้เนื่องจากการพึ่งพาทางเทคนิคในบริการรับส่งข้อความอื่น หรือ Doze และสแตนด์บายแอปทำให้ฟังก์ชันหลักของแอปเสียหาย | ยอมรับได้ | ||
| แอปความปลอดภัย | แอปที่ช่วยให้ผู้ใช้และครอบครัวปลอดภัย | ในกรณีที่เกี่ยวข้อง | ยอมรับได้ | |
| แอปการทำงานอัตโนมัติ | ฟังก์ชันหลักของแอปคือการตั้งเวลาการดำเนินการอัตโนมัติ เช่น สำหรับการรับส่งข้อความโต้ตอบแบบทันที การโทรด้วยเสียง หรือการจัดการรูปภาพใหม่ | ในกรณีที่เกี่ยวข้อง | ยอมรับได้ | |
| แอปที่ใช้ร่วมกันของอุปกรณ์ต่อพ่วง | ฟังก์ชันหลักของแอปคือการรักษาการเชื่อมต่อกับอุปกรณ์ต่อพ่วงอย่างต่อเนื่องเพื่อวัตถุประสงค์ในการให้บริการเข้าถึงอินเทอร์เน็ตแก่อุปกรณ์ต่อพ่วง | ในกรณีที่เกี่ยวข้อง | ยอมรับได้ | |
| แอปจำเป็นต้องเชื่อมต่อกับอุปกรณ์ต่อพ่วงเป็นระยะๆ เพื่อซิงค์เท่านั้น หรือจำเป็นต้องเชื่อมต่อกับอุปกรณ์ เช่น หูฟังไร้สาย ที่เชื่อมต่อผ่านโปรไฟล์บลูทูธมาตรฐานเท่านั้น | ในกรณีที่เกี่ยวข้อง | ไม่ยอมรับ |