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

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

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

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

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

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

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

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

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

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

ข้อจำกัดของโหมด Doze

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

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

รายการตรวจสอบ 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()

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

แอปสามารถตรวจสอบว่าตนเองอยู่ในรายการที่ยกเว้นหรือไม่โดยเรียกใช้ 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. สังเกตลักษณะการทำงานของแอปหลังจากเปิดใช้งานอุปกรณ์อีกครั้ง ตรวจสอบว่าแอปกลับมาทำงานได้อย่างราบรื่นเมื่ออุปกรณ์ออกจากโหมด Doze

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

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

  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. สังเกตลักษณะการทำงานของแอปหลังจากปลุกให้ทำงาน ตรวจสอบว่าแอปกลับมาทำงานได้อย่างราบรื่นจากโหมดสแตนด์บาย โดยเฉพาะอย่างยิ่ง ให้ตรวจสอบว่าการแจ้งเตือนและงานเบื้องหลังของแอปทำงานตามที่คาดไว้หรือไม่

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

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

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

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