Android มีฟีเจอร์ประหยัดพลังงาน 2 อย่างที่จะยืดอายุการใช้งานแบตเตอรี่ให้ผู้ใช้ด้วย การจัดการลักษณะการทำงานของแอปเมื่ออุปกรณ์ไม่ได้เชื่อมต่อกับแหล่งจ่ายไฟ ซึ่งได้แก่ Doze และสแตนด์บายแอป โหมดสลีปจะลดการใช้แบตเตอรี่โดยการเลื่อนเวลากิจกรรมของ CPU และเครือข่ายเบื้องหลังสำหรับแอปเมื่อไม่ได้ใช้อุปกรณ์เป็นระยะเวลานาน แอปสแตนด์บายจะเลื่อนกิจกรรมในเครือข่ายในเบื้องหลังสำหรับแอปที่ไม่มีกิจกรรมล่าสุดของผู้ใช้
ขณะที่อุปกรณ์อยู่ใน Doze แอปจะเข้าถึงทรัพยากรที่ใช้แบตเตอรี่มากจะเลื่อนออกไปจนกว่าจะถึงช่วงเวลาบำรุงรักษา ดูข้อจำกัดที่เฉพาะเจาะจงได้ในส่วนข้อจำกัดของการจัดการพลังงาน
Doze และสแตนด์บายแอปจะจัดการลักษณะการทำงานของแอปทั้งหมดที่ใช้ Android 6.0 ขึ้นไป ไม่ว่าแอปจะกำหนดเป้าหมายเป็น API ระดับ 23 โดยเฉพาะหรือไม่ก็ตาม เพื่อให้ผู้ใช้ได้รับประสบการณ์ที่ดีที่สุด ให้ทดสอบแอปในโหมด Doze และสแตนด์บายแอป แล้วปรับแต่งโค้ดตามที่จำเป็น โปรดดูรายละเอียดในส่วนต่อไปนี้
ทำความเข้าใจ Doze
หากผู้ใช้ถอดปลั๊กอุปกรณ์ทิ้งไว้และอยู่กับที่เป็นระยะเวลาหนึ่งและปิดหน้าจอ อุปกรณ์จะเข้าสู่โหมด Doze ในโหมด "ประหยัดพลังงาน" ระบบจะพยายามประหยัดแบตเตอรี่โดยจำกัดการเข้าถึงเครือข่ายและบริการที่ต้องใช้ CPU มากของแอป และยังป้องกันไม่ให้แอปเข้าถึงเครือข่ายและเลื่อนงาน ซิงค์ และการปลุกมาตรฐาน
ระบบจะออกจากโหมดสลีปเป็นระยะเวลาสั้นๆ เป็นระยะๆ เพื่อให้แอปทำงานที่เลื่อนไว้ให้เสร็จสมบูรณ์ ในระหว่างช่วงเวลาการบำรุงรักษานี้ ระบบจะดำเนินการซิงค์ งาน และการแจ้งเตือนที่รอดำเนินการทั้งหมด และอนุญาตให้แอปเข้าถึงเครือข่าย
เมื่อหมดเวลาบำรุงรักษา ระบบจะเข้าสู่โหมด Doze อีกครั้งโดยระงับการเข้าถึงเครือข่ายและเลื่อนงาน การซิงค์ และการปลุก เมื่อเวลาผ่านไป ระบบจะกำหนดเวลากรอบเวลาการบำรุงรักษาให้นานขึ้น ซึ่งจะช่วยประหยัดแบตเตอรี่ในกรณีที่ไม่มีการใช้งานเป็นเวลานานเมื่ออุปกรณ์ไม่ได้ชาร์จ
เมื่อผู้ใช้ปลุกอุปกรณ์โดยการขยับ การเปิดหน้าจอ หรือการเชื่อมต่อที่ชาร์จ ระบบจะออกจากโหมดสลีปและแอปทั้งหมดจะกลับมาทำงานตามปกติ
การจำกัดการงีบหลับ
ระบบจะใช้ข้อจำกัดต่อไปนี้กับแอปของคุณขณะอยู่ในโหมดสลีป
- ระงับการเข้าถึงเครือข่าย
- ไม่สนใจWake Lock
- เลื่อนการแจ้งเตือนมาตรฐาน
AlarmManager
รวมถึงsetExact()
และsetWindow()
ไปยังช่วงเวลาบำรุงรักษาถัดไป- หากต้องการตั้งปลุกให้เริ่มทำงานขณะอยู่ใน Doze ให้ใช้
setAndAllowWhileIdle()
หรือsetExactAndAllowWhileIdle()
- การปลุกที่ตั้งค่าด้วย
setAlarmClock()
จะยังคงเริ่มทำงานตามปกติ ระบบจะออกจาก Doze ไม่นานก่อนที่การปลุกจะเริ่มทำงาน
- หากต้องการตั้งปลุกให้เริ่มทำงานขณะอยู่ใน Doze ให้ใช้
- ไม่ทำการสแกนหา Wi-Fi
- ไม่อนุญาตให้อะแดปเตอร์การซิงค์ทำงาน
- ไม่อนุญาตให้
JobScheduler
ทำงาน
เช็กลิสต์สำหรับการงีบหลับ
- หากเป็นไปได้ ให้ใช้ Firebase Cloud Messaging (FCM) สําหรับการรับส่งข้อความดาวน์สตรีม
- หากผู้ใช้ต้องเห็นการแจ้งเตือนทันที ให้ใช้ข้อความที่มีลำดับความสำคัญสูงของ FCM ใช้ลำดับความสำคัญสูงสำหรับข้อความที่มีการแจ้งเตือนเท่านั้น ดูคําแนะนําเพิ่มเติมได้ในเอกสารประกอบของ FCM เกี่ยวกับลําดับความสําคัญของข้อความสําหรับ Android
- ระบุข้อมูลให้เพียงพอภายในเพย์โหลดข้อความแรก เพื่อให้ไม่ต้องเข้าถึงเครือข่ายในภายหลัง
- ตั้งปลุกที่สำคัญด้วย
setAndAllowWhileIdle()
และsetExactAndAllowWhileIdle()
- ทดสอบแอปใน Doze
ปรับแอปให้เข้ากับ Doze
โหมดสลีปอาจส่งผลต่อแอปแตกต่างกันไป โดยขึ้นอยู่กับความสามารถของแอปและบริการที่ใช้ แอปจำนวนมากทำงานเป็นปกติในรอบของ Doze โดยไม่ต้องปรับเปลี่ยนอะไร ในบางกรณี คุณต้องเพิ่มประสิทธิภาพวิธีที่แอปจัดการเครือข่าย การปลุก งาน และการซิงค์ แอปต้องจัดการกิจกรรมได้อย่างมีประสิทธิภาพในช่วงที่หยุดทำงานเพื่อบำรุงรักษาแต่ละครั้ง
คุณสามารถใช้วิธี AlarmManager
2 วิธี ได้แก่ setAndAllowWhileIdle()
และ setExactAndAllowWhileIdle()
เพื่อช่วยตั้งเวลานาฬิกาปลุก วิธีการเหล่านี้ช่วยให้คุณสามารถตั้งการปลุก
ที่จะเริ่มทำงานแม้ว่าอุปกรณ์จะอยู่ใน Doze ก็ตาม
ข้อจำกัดการเข้าถึงเครือข่ายในโหมด Doze ยังอาจส่งผลต่อแอปของคุณด้วย โดยเฉพาะอย่างยิ่งหากแอปใช้ข้อความแบบเรียลไทม์ เช่น การสะกิดหรือการแจ้งเตือน หากแอปต้องใช้การเชื่อมต่อกับเครือข่ายอย่างต่อเนื่องเพื่อรับข้อความ ให้ใช้ Firebase Cloud Messaging (FCM) หากเป็นไปได้
หากต้องการยืนยันว่าแอปทำงานตามปกติเมื่อใช้โหมด Doze คุณสามารถใช้adb
คำสั่งเพื่อบังคับให้ระบบเข้าสู่และออกจากโหมด Doze และสังเกตลักษณะการทำงานของแอป ดูรายละเอียดได้ที่ทดสอบด้วย Doze และสแตนด์บายแอป
ทำความเข้าใจสแตนด์บายแอป
สแตนด์บายแอปช่วยให้ระบบระบุได้ว่าแอปไม่มีความเคลื่อนไหวเมื่อผู้ใช้ไม่ได้ใช้แอปอยู่ ระบบจะพิจารณาเมื่อผู้ใช้ไม่ได้แตะแอปเป็นระยะเวลาหนึ่งและไม่มีเงื่อนไขต่อไปนี้เกิดขึ้น
- ผู้ใช้เปิดแอปอย่างชัดเจน
- แอปมีกระบวนการที่ทำงานอยู่เบื้องหน้าในขณะนี้ ไม่ว่าจะเป็นกิจกรรมหรือบริการที่ทำงานอยู่เบื้องหน้า หรือมีการใช้งานโดยกิจกรรมหรือบริการที่ทำงานอยู่เบื้องหน้าอื่นๆ ด้วย
- แอปจะสร้างการแจ้งเตือนที่ผู้ใช้เห็นบนหน้าจอล็อกหรือในถาดการแจ้งเตือน
เมื่อผู้ใช้เสียบอุปกรณ์เข้ากับแหล่งจ่ายไฟ ระบบจะปล่อยแอปออกจากสถานะสแตนด์บาย ซึ่งจะช่วยให้แอปเข้าถึงเครือข่ายและดำเนินการงานและการซิงค์ที่รอดำเนินการได้ หากอุปกรณ์ไม่มีการใช้งานเป็นระยะเวลานาน ระบบจะอนุญาตให้เข้าถึงเครือข่ายของแอปที่ไม่มีการใช้งานประมาณวันละครั้ง
ใช้ FCM เพื่อโต้ตอบกับแอปขณะที่อุปกรณ์ไม่ได้ใช้งาน
Firebase Cloud Messaging (FCM) เป็นบริการจากระบบคลาวด์ไปยังอุปกรณ์ที่ช่วยให้คุณรองรับการรับส่งข้อความดาวน์สตรีมแบบเรียลไทม์ระหว่างบริการแบ็กเอนด์กับแอปในอุปกรณ์ Android FCM ให้การเชื่อมต่อถาวรแบบเดี่ยวกับระบบคลาวด์ แอปทั้งหมดที่ต้องการการรับส่งข้อความแบบเรียลไทม์สามารถแชร์การเชื่อมต่อนี้ได้ การเชื่อมต่อที่แชร์นี้ช่วยเพิ่มประสิทธิภาพการใช้แบตเตอรี่ได้อย่างมากเนื่องจากทำให้แอปหลายแอปไม่จำเป็นต้องรักษาการเชื่อมต่อถาวรแยกต่างหากของตนเอง ซึ่งอาจทำให้แบตเตอรี่หมดเร็ว ด้วยเหตุนี้ หากแอปของคุณต้องมีการผสานรวมการรับส่งข้อความกับบริการแบ็กเอนด์ เราขอแนะนําอย่างยิ่งให้คุณใช้ FCM หากเป็นไปได้ แทนที่จะคงการเชื่อมต่อเครือข่ายไว้เอง
FCM ได้รับการเพิ่มประสิทธิภาพให้ใช้งานได้กับโหมด Doze และโหมดสแตนด์บายแอป ข้อความที่มีลำดับความสำคัญสูงของ FCM ให้คุณปลุกระบบแอปเพื่อดึงดูดผู้ใช้ ในโหมด "Doze" หรือ "โหมดสแตนด์บายของแอป" ระบบจะส่งข้อความและให้สิทธิ์เข้าถึงบริการเครือข่ายและการล็อกที่ตื่นอยู่บางส่วนแก่แอปชั่วคราว จากนั้นจะเปลี่ยนอุปกรณ์หรือแอปกลับไปยังสถานะ "ไม่มีการใช้งาน" สําหรับการแจ้งเตือนที่ผู้ใช้มองเห็นได้ซึ่งจําเป็นต้องดำเนินการโดยทันที ให้พิจารณาใช้ข้อความที่มีลําดับความสําคัญสูงเพื่อเปิดใช้การนำส่งในโหมดสลีป ข้อความที่มีลำดับความสำคัญสูง จะส่งผลให้เกิดการแจ้งเตือน โปรดดูข้อมูลเพิ่มเติมที่คำแนะนำของ FCM เกี่ยวกับข้อความที่มีลำดับความสำคัญสูง
สำหรับข้อความที่ไม่ได้ส่งผลให้มีการแจ้งเตือน เช่น การอัปเดตเนื้อหาแอปเป็นเวอร์ชันล่าสุดในเบื้องหลังหรือเริ่มการซิงค์ข้อมูล ให้ใช้ข้อความ FCM สำคัญระดับปกติ ระบบจะส่งข้อความที่มีลําดับความสําคัญปกติทันทีหากอุปกรณ์ไม่ได้อยู่ในโหมด Doze หากอุปกรณ์อยู่ในโหมด Doze ระบบจะส่งข้อความในช่วงที่ระบบบำรุงรักษาโหมด Doze เป็นระยะๆ หรือทันทีที่ผู้ใช้ปลุกอุปกรณ์
ตามแนวทางปฏิบัติแนะนำทั่วไป หากแอปต้องใช้การรับส่งข้อความดาวน์สตรีม ให้ใช้ FCM หากแอปใช้ FCM อยู่แล้ว ให้ตรวจสอบว่าแอปใช้ข้อความที่มีลำดับความสำคัญสูงสำหรับข้อความที่ส่งผลให้มีการแจ้งเตือนที่แสดงต่อผู้ใช้เท่านั้น
การสนับสนุนสำหรับ Use Case อื่นๆ
แอปเกือบทั้งหมดรองรับโหมดสลีปโดยจัดการการเชื่อมต่อเครือข่าย การปลุก งาน และการซิงค์ รวมถึงการใช้ข้อความ FCM สำหรับชุด Use Case ที่แคบ ข้อมูลนี้อาจไม่เพียงพอ ในกรณีเช่นนี้ ระบบจะแสดงรายการแอปที่กำหนดค่าได้ซึ่งได้รับการยกเว้นบางส่วนจากการเพิ่มประสิทธิภาพโหมดสลีปและแอปที่รอดำเนินการ
แอปที่ได้รับการยกเว้นบางส่วนจะใช้เครือข่ายและ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
- สังเกตลักษณะการทำงานของแอปหลังจากที่คุณเปิดใช้งานอุปกรณ์อีกครั้ง ตรวจสอบว่าแอปกู้คืนได้อย่างราบรื่นเมื่ออุปกรณ์ออกจากโหมดสลีป
ทดสอบแอปด้วยโหมดแอปรอ
หากต้องการทดสอบโหมดสแตนด์บายแอปด้วยแอปของคุณ ให้ดำเนินการดังนี้
- กำหนดค่าอุปกรณ์ฮาร์ดแวร์หรืออุปกรณ์เสมือนด้วยภาพระบบ 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>
- สังเกตลักษณะการทำงานของแอปหลังจากปลุกแอป ตรวจสอบว่าแอป กู้คืนได้อย่างราบรื่นจากโหมดสแตนด์บาย โดยเฉพาะอย่างยิ่ง ให้ตรวจสอบว่าการแจ้งเตือนและงานในเบื้องหลังของแอปทำงานตามที่คาดไว้หรือไม่
กรณีการใช้งานที่ยอมรับได้สำหรับการยกเว้น
ตารางต่อไปนี้ไฮไลต์กรณีการใช้งานหลายกรณีและระบุว่าแอปสามารถใช้ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
การดำเนินการตามเจตนาในสถานการณ์เหล่านี้ได้หรือไม่ โดยทั่วไปแล้ว แอปของคุณจะไม่เป็นไปตามข้อยกเว้นเหล่านี้ เว้นแต่โหมดสลีปหรือโหมดสแตนด์บายของแอปจะขัดจังหวะฟังก์ชันหลักของแอป หรือมีเหตุผลทางเทคนิคที่ทำให้แอปของคุณใช้ข้อความที่มีลำดับความสำคัญสูงของ FCM ไม่ได้
ดูข้อมูลเพิ่มเติมได้ที่การรองรับกรณีการใช้งานอื่นๆ
ประเภท | กรณีการใช้งาน | ใช้ FCM ได้ไหม | ได้รับการยกเว้นหรือไม่ | หมายเหตุ |
---|---|---|---|---|
แอปการรับส่งข้อความโต้ตอบแบบทันที แชท หรือโทร | ต้องส่งข้อความแบบเรียลไทม์ถึงผู้ใช้ขณะที่อุปกรณ์อยู่ใน Doze หรือแอปอยู่ในสแตนด์บายแอป | ใช่ กำลังใช้ FCM | ไม่ยอมรับ | ใช้ข้อความที่มีลำดับความสำคัญสูงของ FCM เพื่อปลุกระบบแอปและเข้าถึงเครือข่าย |
ได้ แต่ไม่ได้ใช้ข้อความที่มีลำดับความสำคัญสูงของ FCM | ||||
แอปรับส่งข้อความโต้ตอบแบบทันที แชท หรือการโทร แอป VOIP สำหรับองค์กร | ไม่ได้ ใช้ FCM ไม่ได้ เนื่องจากการอ้างอิงทางเทคนิคในบริการรับส่งข้อความอื่น หรือ Doze และสแตนด์บายแอปทำให้ฟังก์ชันหลักของแอปขัดข้อง | ยอมรับได้ | ||
แอปความปลอดภัย | แอปที่ช่วยดูแลผู้ใช้และครอบครัวให้ปลอดภัย | ในกรณีที่เกี่ยวข้อง | ยอมรับได้ | |
แอปการทำงานอัตโนมัติ | ฟังก์ชันหลักของแอปคือการกำหนดเวลาการดำเนินการอัตโนมัติ เช่น สําหรับการรับส่งข้อความด่วน การโทรด้วยเสียง หรือการจัดการรูปภาพแบบใหม่ | ในกรณีที่เกี่ยวข้อง | ยอมรับได้ | |
แอปที่ใช้ร่วมกันของอุปกรณ์ต่อพ่วง | ฟังก์ชันหลักของแอปคือรักษาการเชื่อมต่ออย่างต่อเนื่องกับอุปกรณ์ต่อพ่วงเพื่อจุดประสงค์ในการเชื่อมต่ออินเทอร์เน็ตของอุปกรณ์ต่อพ่วง | ในกรณีที่เกี่ยวข้อง | ยอมรับได้ | |
แอปต้องเชื่อมต่อกับอุปกรณ์ต่อพ่วงเป็นระยะๆ เพื่อซิงค์ หรือต้องเชื่อมต่อกับอุปกรณ์ เช่น หูฟังไร้สาย ที่เชื่อมต่อผ่านโปรไฟล์บลูทูธมาตรฐานเท่านั้น | ในกรณีที่เกี่ยวข้อง | ยอมรับไม่ได้ |