เพิ่มประสิทธิภาพสำหรับ Doze และสแตนด์บายแอป

Android มีฟีเจอร์ประหยัดพลังงาน 2 อย่างที่จะยืดอายุการใช้งานแบตเตอรี่ให้ผู้ใช้ด้วย การจัดการลักษณะการทำงานของแอปเมื่ออุปกรณ์ไม่ได้เชื่อมต่อกับแหล่งจ่ายไฟ ซึ่งได้แก่ Doze และสแตนด์บายแอป โหมดสลีปจะลดการใช้แบตเตอรี่โดยการเลื่อนเวลากิจกรรมของ CPU และเครือข่ายเบื้องหลังสำหรับแอปเมื่อไม่ได้ใช้อุปกรณ์เป็นระยะเวลานาน แอปสแตนด์บายจะเลื่อนกิจกรรมในเครือข่ายในเบื้องหลังสำหรับแอปที่ไม่มีกิจกรรมล่าสุดของผู้ใช้

ขณะที่อุปกรณ์อยู่ใน Doze แอปจะเข้าถึงทรัพยากรที่ใช้แบตเตอรี่มากจะเลื่อนออกไปจนกว่าจะถึงช่วงเวลาบำรุงรักษา ดูข้อจำกัดที่เฉพาะเจาะจงได้ในส่วนข้อจำกัดของการจัดการพลังงาน

Doze และสแตนด์บายแอปจะจัดการลักษณะการทำงานของแอปทั้งหมดที่ใช้ Android 6.0 ขึ้นไป ไม่ว่าแอปจะกำหนดเป้าหมายเป็น API ระดับ 23 โดยเฉพาะหรือไม่ก็ตาม เพื่อให้ผู้ใช้ได้รับประสบการณ์ที่ดีที่สุด ให้ทดสอบแอปในโหมด Doze และสแตนด์บายแอป แล้วปรับแต่งโค้ดตามที่จำเป็น โปรดดูรายละเอียดในส่วนต่อไปนี้

ทำความเข้าใจ Doze

หากผู้ใช้ถอดปลั๊กอุปกรณ์ทิ้งไว้และอยู่กับที่เป็นระยะเวลาหนึ่งและปิดหน้าจอ อุปกรณ์จะเข้าสู่โหมด Doze ในโหมด "ประหยัดพลังงาน" ระบบจะพยายามประหยัดแบตเตอรี่โดยจำกัดการเข้าถึงเครือข่ายและบริการที่ต้องใช้ CPU มากของแอป และยังป้องกันไม่ให้แอปเข้าถึงเครือข่ายและเลื่อนงาน ซิงค์ และการปลุกมาตรฐาน

ระบบจะออกจากโหมดสลีปเป็นระยะเวลาสั้นๆ เป็นระยะๆ เพื่อให้แอปทำงานที่เลื่อนไว้ให้เสร็จสมบูรณ์ ในระหว่างช่วงเวลาการบำรุงรักษานี้ ระบบจะดำเนินการซิงค์ งาน และการแจ้งเตือนที่รอดำเนินการทั้งหมด และอนุญาตให้แอปเข้าถึงเครือข่าย

ภาพที่ 1 Doze มีช่วงเวลาบำรุงรักษาตามรอบเพื่อให้แอปใช้เครือข่ายและจัดการกับกิจกรรมที่รอดำเนินการได้

เมื่อหมดเวลาบำรุงรักษา ระบบจะเข้าสู่โหมด Doze อีกครั้งโดยระงับการเข้าถึงเครือข่ายและเลื่อนงาน การซิงค์ และการปลุก เมื่อเวลาผ่านไป ระบบจะกำหนดเวลากรอบเวลาการบำรุงรักษาให้นานขึ้น ซึ่งจะช่วยประหยัดแบตเตอรี่ในกรณีที่ไม่มีการใช้งานเป็นเวลานานเมื่ออุปกรณ์ไม่ได้ชาร์จ

เมื่อผู้ใช้ปลุกอุปกรณ์โดยการขยับ การเปิดหน้าจอ หรือการเชื่อมต่อที่ชาร์จ ระบบจะออกจากโหมดสลีปและแอปทั้งหมดจะกลับมาทำงานตามปกติ

การจำกัดการงีบหลับ

ระบบจะใช้ข้อจำกัดต่อไปนี้กับแอปของคุณขณะอยู่ในโหมดสลีป

  • ระงับการเข้าถึงเครือข่าย
  • ไม่สนใจWake Lock
  • เลื่อนการแจ้งเตือนมาตรฐาน AlarmManager รวมถึง setExact() และ setWindow() ไปยังช่วงเวลาบำรุงรักษาถัดไป
    • หากต้องการตั้งปลุกให้เริ่มทำงานขณะอยู่ใน Doze ให้ใช้ setAndAllowWhileIdle() หรือ setExactAndAllowWhileIdle()
    • การปลุกที่ตั้งค่าด้วย setAlarmClock() จะยังคงเริ่มทำงานตามปกติ ระบบจะออกจาก Doze ไม่นานก่อนที่การปลุกจะเริ่มทำงาน
  • ไม่ทำการสแกนหา Wi-Fi
  • ไม่อนุญาตให้อะแดปเตอร์การซิงค์ทำงาน
  • ไม่อนุญาตให้ JobScheduler ทำงาน

เช็กลิสต์สำหรับการงีบหลับ

ปรับแอปให้เข้ากับ 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()

ผู้ใช้สามารถกำหนดค่ารายการแอปที่ได้รับการยกเว้นด้วยตนเองได้ในการตั้งค่า > แบตเตอรี่ > การเพิ่มประสิทธิภาพแบตเตอรี่ อีกทางเลือกหนึ่งคือระบบจะระบุวิธีให้แอปขอให้ผู้ใช้ยกเว้นแอปดังกล่าว ดังนี้

แอปจะตรวจสอบได้ว่าแอปดังกล่าวอยู่ในรายการการยกเว้นหรือไม่โดยโทรไปที่ isIgnoringBatteryOptimizations()

ทดสอบด้วย Doze และสแตนด์บายแอป

เพื่อช่วยให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ยอดเยี่ยม ให้ทดสอบแอปทั้งหมดใน Doze และสแตนด์บายแอป

ทดสอบแอปด้วยโหมด Doze

คุณสามารถทดสอบโหมด Doze ได้โดยทำดังนี้

  1. กำหนดค่าอุปกรณ์ฮาร์ดแวร์หรืออุปกรณ์เสมือนด้วยอิมเมจระบบ Android 6.0 (API ระดับ 23) ขึ้นไป
  2. เชื่อมต่ออุปกรณ์กับเครื่องสำหรับพัฒนาซอฟต์แวร์และติดตั้งแอป
  3. เรียกใช้แอปและปล่อยให้แอปทำงาน
  4. บังคับให้ระบบเข้าสู่โหมดไม่มีการใช้งานโดยเรียกใช้คำสั่งต่อไปนี้
        $ adb shell dumpsys deviceidle force-idle
        
  5. เมื่อพร้อมแล้ว ให้ออกจากโหมดไม่มีการใช้งานโดยเรียกใช้คำสั่งต่อไปนี้
        $ adb shell dumpsys deviceidle unforce
        
  6. เปิดใช้งานอุปกรณ์อีกครั้งโดยเรียกใช้คำสั่งต่อไปนี้
        $ adb shell dumpsys battery reset
        
  7. สังเกตลักษณะการทำงานของแอปหลังจากที่คุณเปิดใช้งานอุปกรณ์อีกครั้ง ตรวจสอบว่าแอปกู้คืนได้อย่างราบรื่นเมื่ออุปกรณ์ออกจากโหมดสลีป

ทดสอบแอปด้วยโหมดแอปรอ

หากต้องการทดสอบโหมดสแตนด์บายแอปด้วยแอปของคุณ ให้ดำเนินการดังนี้

  1. กำหนดค่าอุปกรณ์ฮาร์ดแวร์หรืออุปกรณ์เสมือนด้วยภาพระบบ Android 6.0 (API ระดับ 23) ขึ้นไป
  2. เชื่อมต่ออุปกรณ์กับเครื่องสำหรับพัฒนาซอฟต์แวร์และติดตั้งแอป
  3. เรียกใช้แอปและปล่อยให้แอปทำงาน
  4. บังคับแอปให้อยู่ในโหมดสแตนด์บายแอปโดยเรียกใช้คำสั่งต่อไปนี้
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. จำลองการปลุกแอปโดยใช้คำสั่งต่อไปนี้
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. สังเกตลักษณะการทำงานของแอปหลังจากปลุกแอป ตรวจสอบว่าแอป กู้คืนได้อย่างราบรื่นจากโหมดสแตนด์บาย โดยเฉพาะอย่างยิ่ง ให้ตรวจสอบว่าการแจ้งเตือนและงานในเบื้องหลังของแอปทำงานตามที่คาดไว้หรือไม่

กรณีการใช้งานที่ยอมรับได้สำหรับการยกเว้น

ตารางต่อไปนี้ไฮไลต์กรณีการใช้งานหลายกรณีและระบุว่าแอปสามารถใช้ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSการดำเนินการตามเจตนาในสถานการณ์เหล่านี้ได้หรือไม่ โดยทั่วไปแล้ว แอปของคุณจะไม่เป็นไปตามข้อยกเว้นเหล่านี้ เว้นแต่โหมดสลีปหรือโหมดสแตนด์บายของแอปจะขัดจังหวะฟังก์ชันหลักของแอป หรือมีเหตุผลทางเทคนิคที่ทำให้แอปของคุณใช้ข้อความที่มีลำดับความสำคัญสูงของ FCM ไม่ได้

ดูข้อมูลเพิ่มเติมได้ที่การรองรับกรณีการใช้งานอื่นๆ

ประเภท กรณีการใช้งาน ใช้ FCM ได้ไหม ได้รับการยกเว้นหรือไม่ หมายเหตุ
แอปการรับส่งข้อความโต้ตอบแบบทันที แชท หรือโทร ต้องส่งข้อความแบบเรียลไทม์ถึงผู้ใช้ขณะที่อุปกรณ์อยู่ใน Doze หรือแอปอยู่ในสแตนด์บายแอป ใช่ กำลังใช้ FCM ไม่ยอมรับ ใช้ข้อความที่มีลำดับความสำคัญสูงของ FCM เพื่อปลุกระบบแอปและเข้าถึงเครือข่าย
ได้ แต่ไม่ได้ใช้ข้อความที่มีลำดับความสำคัญสูงของ FCM
แอปรับส่งข้อความโต้ตอบแบบทันที แชท หรือการโทร แอป VOIP สำหรับองค์กร ไม่ได้ ใช้ FCM ไม่ได้ เนื่องจากการอ้างอิงทางเทคนิคในบริการรับส่งข้อความอื่น หรือ Doze และสแตนด์บายแอปทำให้ฟังก์ชันหลักของแอปขัดข้อง ยอมรับได้
แอปความปลอดภัย แอปที่ช่วยดูแลผู้ใช้และครอบครัวให้ปลอดภัย ในกรณีที่เกี่ยวข้อง ยอมรับได้
แอปการทำงานอัตโนมัติ ฟังก์ชันหลักของแอปคือการกำหนดเวลาการดำเนินการอัตโนมัติ เช่น สําหรับการรับส่งข้อความด่วน การโทรด้วยเสียง หรือการจัดการรูปภาพแบบใหม่ ในกรณีที่เกี่ยวข้อง ยอมรับได้
แอปที่ใช้ร่วมกันของอุปกรณ์ต่อพ่วง ฟังก์ชันหลักของแอปคือรักษาการเชื่อมต่ออย่างต่อเนื่องกับอุปกรณ์ต่อพ่วงเพื่อจุดประสงค์ในการเชื่อมต่ออินเทอร์เน็ตของอุปกรณ์ต่อพ่วง ในกรณีที่เกี่ยวข้อง ยอมรับได้
แอปต้องเชื่อมต่อกับอุปกรณ์ต่อพ่วงเป็นระยะๆ เพื่อซิงค์ หรือต้องเชื่อมต่อกับอุปกรณ์ เช่น หูฟังไร้สาย ที่เชื่อมต่อผ่านโปรไฟล์บลูทูธมาตรฐานเท่านั้น ในกรณีที่เกี่ยวข้อง ยอมรับไม่ได้