การใช้การล็อกการปลุกอาจทำให้ประสิทธิภาพของอุปกรณ์ลดลง หากจำเป็นต้องใช้การปลุกระบบด้วยโหมดล็อก คุณควรดำเนินการอย่างถูกต้อง เอกสารนี้กล่าวถึงแนวทางปฏิบัติแนะนำบางอย่างที่จะช่วยคุณหลีกเลี่ยงข้อผิดพลาดที่พบได้ทั่วไปเกี่ยวกับระบบล็อกการปลุก
ตั้งชื่อการทำงานขณะล็อกอย่างเหมาะสม
เราขอแนะนำให้ใส่ชื่อแพ็กเกจ คลาส หรือเมธอดในแท็ก 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();
}
}