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