เพิ่มประสิทธิภาพการใช้งานแบตเตอรี่สำหรับ API การกำหนดเวลางาน

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

ที่เกี่ยวข้องในกรณีที่เหมาะสม

เลือกข้อจำกัดที่เหมาะสมและรวมงาน

การระบุข้อจำกัดที่เหมาะสมเป็นสิ่งสำคัญเพื่อลดภาระงานที่อุปกรณ์ต้องรับ (สำหรับงาน JobScheduler โปรดดูJobInfo.Builderสำหรับ รายการข้อจำกัด) ตัวอย่างเช่น หากต้องการให้แอปไม่ทำให้แบตเตอรี่หมดเร็ว คุณควรระบุRequiresCharging ข้อจำกัด ข้อจำกัดนี้จะบอกระบบไม่ให้เรียกใช้ช็อตเวิร์กจนกว่าระดับแบตเตอรี่จะเพิ่มขึ้นจริงๆ ในทำนองเดียวกัน การใช้ Wi-Fi โดยทั่วไปจะใช้พลังงานน้อยกว่าอินเทอร์เน็ตมือถือ ดังนั้นหากงานของคุณต้องใช้การเชื่อมต่อเครือข่ายแต่รอได้จนกว่าจะใช้เครือข่ายที่ไม่จำกัดปริมาณได้ คุณควรตั้งค่าข้อจำกัด NetworkType.UNMETERED

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

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

ทำเครื่องหมายงานว่าเร่งด่วนเฉพาะในกรณีที่งานนั้นต้องดำเนินการอย่างเร่งด่วนเท่านั้น

หากงานใดเร่งด่วนเป็นพิเศษ คุณสามารถทำเครื่องหมายว่าเร่งด่วนได้ (สำหรับงาน JobScheduler ให้เรียกใช้ JobInfo.Builder.setExpedited(true)) การทำเช่นนี้จะจัดลำดับความสำคัญของงานในหลายๆ ด้าน ตัวอย่างเช่น ระบบจะเรียกใช้งาน งานเหล่านั้นทันทีที่ทำได้ และข้อจำกัดด้านการจัดการพลังงานมีแนวโน้มน้อยลง ที่จะส่งผลต่องานที่เร่งด่วน

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

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

ตรวจสอบสาเหตุที่ระบบหยุดงาน

หากงานหยุดก่อนที่จะเสร็จสมบูรณ์ คุณสามารถตรวจสอบสาเหตุที่งานหยุดได้โดย เรียกใช้ WorkInfo.getStopReason() (สำหรับงาน JobScheduler ให้เรียกใช้ JobParameters.getStopReason() การทำเช่นนี้มีความสำคัญด้วยเหตุผล 2 ประการ ก่อนอื่นแน่นอนว่าคุณต้องการให้งานเสร็จ การค้นหาสาเหตุที่งานหยุดทำงานจะช่วยให้คุณหลีกเลี่ยงสถานการณ์ที่คล้ายกันได้ นอกจากนี้ ระบบยัง มีแนวโน้มที่จะหยุดงานเนื่องจากพฤติกรรมที่ใช้ทรัพยากรของระบบมากเกินไป คุณไม่ต้องการให้แอปเป็นแอปที่ไม่ดี ซึ่งใช้แบตเตอรี่หรือเครือข่ายโดยไม่จำเป็น

เช่น หากงานของคุณหยุดทำงานบ่อยครั้งด้วยเหตุผล STOP_REASON_TIMEOUT อาจมีกรณีข้อยกเว้นที่บางครั้งทำให้งานใช้เวลานานกว่าที่คุณคาดไว้มาก

เราขอแนะนำให้คุณใช้เครื่องมือวิเคราะห์เพื่อติดตามว่าระบบหยุดงานของแอปหรือไม่ และด้วยเหตุผลใด