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

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

ตั้งชื่อการทำงานขณะล็อกอย่างเหมาะสม

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

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

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

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

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

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

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

ตรวจสอบว่าปลดล็อกการล็อกการปลุกไว้เสมอ

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

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() จะปล่อยการล็อกการปลุกแม้ว่าจะมีการยกเว้นก็ตาม

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();
    }
}