ทำตามแนวทางปฏิบัติแนะนำเกี่ยวกับโหมดล็อกหน้าจอ

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

ตั้งชื่อ Wake Lock อย่างเหมาะสม

เราขอแนะนำให้ใส่ชื่อแพ็กเกจ คลาส หรือเมธอดในแท็ก Wakelock วิธีนี้จะช่วยให้ค้นหาตำแหน่งในซอร์สโค้ดที่สร้าง Wake Lock ได้ง่ายขึ้นหากเกิดข้อผิดพลาด เคล็ดลับเพิ่มเติมมีดังนี้

  • อย่าใส่ข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ (PII) ในชื่อ เช่น อีเมล หากอุปกรณ์ตรวจพบ PII ในแท็ก Wake Lock ระบบจะบันทึก _UNKNOWN แทนแท็กที่คุณระบุ
  • อย่ารับชื่อคลาสหรือเมธอดแบบเป็นโปรแกรม เช่น โดยการเรียกใช้ getName() หากคุณพยายามรับชื่อแบบเป็นโปรแกรม ชื่ออาจถูกสร้างความสับสนโดยเครื่องมืออย่าง Proguard แต่ให้ใช้สตริงที่ฮาร์ดโค้ดแทน
  • อย่าเพิ่มตัวนับหรือตัวระบุที่ไม่ซ้ำกันลงในแท็ก Wake Lock โค้ดที่สร้าง Wake Lock ควรใช้แท็กเดียวกันทุกครั้งที่ทำงาน แนวทางปฏิบัตินี้ช่วยให้ระบบรวบรวมการใช้งาน Wake Lock ของแต่ละเมธอดได้

ตรวจสอบว่าแอปแสดงในเบื้องหน้า

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

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

ใช้ตรรกะที่เรียบง่าย

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

ตรวจสอบว่ามีการปล่อย Wake Lock เสมอ

หากใช้ Wake Lock คุณต้องตรวจสอบว่า Wake Lock ทุกรายการที่ได้รับได้รับการปล่อยอย่างถูกต้อง ซึ่งไม่ใช่เรื่องง่ายอย่างที่คิดเสมอไป ตัวอย่างเช่น โค้ดต่อไปนี้มีปัญหา

Kotlin

@Throws(MyException::class)
fun doSomethingAndRelease() {
    wakeLock.apply {
        acquire()
        doTheWork() // can potentially throw MyException
        release()   // does not run if an exception is thrown
    }
}

Java

void doSomethingAndRelease() throws MyException {
    wakeLock.acquire();
    doTheWork();         // can potentially throw MyException
    wakeLock.release();  // does not run if an exception is thrown
}

ปัญหาที่นี่คือเมธอด doTheWork() สามารถส่งกลับข้อยกเว้น MyException ได้ หากมี เมธอด doSomethingAndRelease() จะเผยแพร่ข้อยกเว้นออกไป และจะไม่ไปถึงการเรียก release() ผลลัพธ์คือระบบได้รับ Wake Lock แต่ไม่ได้ปล่อย ซึ่งเป็นสิ่งที่ไม่ดีอย่างยิ่ง

ในโค้ดที่แก้ไขแล้ว doSomethingAndRelease() จะตรวจสอบว่าได้ปล่อย Wake Lock แล้วแม้ว่าจะมีการส่งข้อยกเว้นก็ตาม

Kotlin

@Throws(MyException::class)
fun doSomethingAndRelease() {
    wakeLock.apply {
        try {
            acquire()
            doTheWork()
        } finally {
            release()
        }
    }
}

Java

void doSomethingAndRelease() throws MyException {
    try {
        wakeLock.acquire();
        doTheWork();
    } finally {
        wakeLock.release();
    }
}