ไลบรารีและ API ของระบบหลายรายการสามารถรับ Wake Lock ที่ระบุแหล่งที่มาได้ ในแอปของคุณ ซึ่งอาจทำให้ระบุ Wake Lock ในแอปที่ อาจก่อให้เกิดปัญหาได้ยาก หากคุณใช้ API ในทางที่ผิด แอปอาจ ถือ Wake Lock นานเกินไป แม้ว่าคุณจะไม่ได้เรียกใช้ API ของ Wake Lock โดยตรงก็ตาม
ในสถานการณ์ที่ API อื่นๆ ได้รับ Wake Lock คุณควรหลีกเลี่ยงการรับ Wake Lock ด้วยตนเอง
เอกสารนี้แสดงชื่อการทำงานขณะล็อกที่พบบ่อยบางส่วนซึ่งคุณอาจเห็นเมื่อใช้ เครื่องมือแก้ไขข้อบกพร่องของการทำงานขณะล็อก นอกจากนี้ คุณยังอาจเห็นชื่อเหล่านี้ในรายงานจาก Vitals ด้วย ในบางกรณี ไลบรารีหรือ System API อาจสร้าง Wake Lock ในกรณีอื่นๆ มีเหตุผลที่เครื่องมือ ทำให้ชื่อ Wake Lock ที่คุณใช้ในแอปไม่ชัดเจน คุณสามารถใช้เครื่องมือ แก้ไขข้อบกพร่องเพื่อระบุ Wake Lock ที่ทำงานผิดปกติ จากนั้นค้นหาชื่อ Wake Lock ในเอกสารนี้เพื่อระบุว่า API ใดอาจทำให้เกิดปัญหาและ วิธีแก้ปัญหา
เอกสารนี้ครอบคลุมสถานการณ์ที่อาจมีการสร้าง Wake Lock ในแต่ละกรณี แม้ว่าไลบรารีหรือ API อื่นๆ อาจสร้าง Wake lock แต่ระบบจะระบุว่าแอปที่เรียกใช้ API นั้นเป็นผู้สร้างล็อก
- AlarmManager
- เสียงและสื่อ
- บลูทูธ
- เซ็นเซอร์ของอุปกรณ์
- Firebase Cloud Message (FCM)
- JobScheduler
- ตำแหน่ง
- WorkManager
_UNKNOWN: แสดงโดยเครื่องมือแก้ไขข้อบกพร่องหากชื่อการทำงานขณะล็อกดูเหมือนจะใช้ ข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ (PII)
AlarmManager
AlarmManager จะรับ Wake Lock และเชื่อมโยงกับแอปที่เรียกใช้
AlarmManager จะรับ Wake Lock เมื่อสัญญาณเตือนดังขึ้น และปล่อย
ล็อกเมื่อเมธอด onReceive() ของการออกอากาศสัญญาณเตือน
ทำงานเสร็จ
ชื่อ Wake Lock
AlarmManager สร้างการทำงานขณะล็อกที่มีชื่อ *alarm* (เครื่องหมายดอกจันเป็นส่วนหนึ่งของชื่อ Wake Lock ไม่ได้แสดงถึงไวลด์การ์ด)
คำแนะนำ
เราขอแนะนำให้ปฏิบัติตามแนวทางต่อไปนี้เพื่อเพิ่มประสิทธิภาพลักษณะการทำงานของการปลุก
- ใช้
AlarmManagerเพื่อเพิ่มประสิทธิภาพความถี่ในการตั้งเวลาปลุก - ใช้เฉพาะการปลุกประเภท
RTC_WAKEUP(ซึ่งจะปลุกอุปกรณ์) เมื่อจำเป็นเท่านั้น - ลดการใช้อาลามและหลีกเลี่ยงการทำงานที่ใช้เวลานานในเมธอด
onReceive()
เสียงและสื่อ
Media API สามารถรับ Wake Lock เมื่อบันทึกหรือเล่นเสียง ระบบจะระบุว่าแอปการโทรเป็นผู้ทำให้หน้าจอตื่นอยู่
ชื่อ Wake Lock
API สื่อจะรับ Wake Lock ที่มีชื่อต่างๆ ซึ่งขึ้นต้นด้วย Audio ดังนี้
AudioBitPerfect: ใช้สำหรับการเล่นเสียง USB แบบไม่สูญเสียข้อมูลAudioDirectOut: ใช้สำหรับการเล่นเสียงแบบไม่สูญเสียข้อมูลบนทีวีหรืออุปกรณ์พิเศษAudioDup: ใช้สำหรับการเล่นการแจ้งเตือนขณะเชื่อมต่อผ่านบลูทูธ หรือ USBAudioIn: ใช้สำหรับการบันทึกเสียงเมื่ออยู่ในโหมดกล้องวิดีโอขณะที่ไมโครโฟน ทำงานอยู่AudioMix: ใช้สำหรับการเล่นเสียงไปยังอุปกรณ์ทั่วไปAudioOffload: ใช้สำหรับการเล่นเพลงอย่างเดียวในระยะยาว สำหรับแอปที่รองรับ โหมดนี้AudioSpatial: ใช้สำหรับการเล่นเสียงภาพยนตร์หรือเพลงแบบหลายช่องบน อุปกรณ์ที่รองรับเสียงรอบทิศทางAudioUnknown: ใช้เมื่อสถานการณ์อื่นๆ ไม่เกี่ยวข้องMmapCapture: ใช้สำหรับการบันทึกเสียงที่มีเวลาในการตอบสนองต่ำMmapPlayback: ใช้สำหรับการเล่นที่มีเวลาในการตอบสนองต่ำ เช่น สำหรับการเล่นเกมหรือสำหรับ แอปพลิเคชันเสียงระดับมืออาชีพ
คำแนะนำ
เราขอแนะนำให้ปฏิบัติดังนี้
- อย่าใช้ชื่อการทำงานขณะล็อกที่ขึ้นต้นด้วย
Audio - หากใช้ Media API คุณไม่จำเป็นต้องขอ Wake Lock โดยตรง แต่สามารถใช้ API เพื่อขอ Wake Lock ที่จำเป็นให้คุณได้
- เมื่อใช้ Media API ให้สิ้นสุดเซสชันสื่อเมื่อไม่ต้องการใช้แล้ว
บลูทูธ
API บลูทูธของแพลตฟอร์มจะไม่มีการล็อกการปลุกที่เกิดจาก แอปพลิเคชันในขณะที่เกิดการดำเนินการผ่านบลูทูธ หากต้องการช่วยยืนยันว่าการรับส่งผ่านบลูทูธเกิดขึ้นในเบื้องหลัง ให้กำหนดเวลางานโดยใช้ WorkManager
คำแนะนำ
- ใช้การจับคู่อุปกรณ์เสริมเพื่อจับคู่อุปกรณ์บลูทูธเพื่อหลีกเลี่ยง การรับ Wake Lock ด้วยตนเองในระหว่างการจับคู่บลูทูธ
- โปรดดูคำแนะนำสื่อสารในเบื้องหลังเพื่อทำความเข้าใจวิธีสื่อสารผ่านบลูทูธในเบื้องหลัง
- หากจำเป็นต้องใช้ Wake Lock ด้วยตนเอง ให้ใช้ Wake Lock เฉพาะในระยะเวลาการดำเนินการของบลูทูธ
เซ็นเซอร์ของอุปกรณ์
การติดตามข้อมูลเซ็นเซอร์ของอุปกรณ์ เช่น จำนวนก้าว ข้อมูลตัวตรวจวัดความเร่งหรือเครื่องวัดการหมุน ทำได้หลายวิธี
ใน Wear OS ให้ใช้ Wear Health Services เพื่อดึงข้อมูลอุปกรณ์ เช่น ระดับความสูง อัตราการเต้นของหัวใจ และระยะทางที่เดินทาง
หากแอปพลิเคชันอื่นๆ รวบรวมข้อมูล คุณสามารถใช้ Health Connect ร่วมกับ WorkManager เพื่อดึงข้อมูลได้
สำหรับสถานการณ์ต่างๆ เช่น การติดตามส่วนต่างของจำนวนก้าวหรือระยะทางที่เดินทาง คุณสามารถใช้ Recording API บนอุปกรณ์เคลื่อนที่ ร่วมกับ WorkManager เพื่อดึงข้อมูลได้
ในบางกรณี คุณอาจต้องใช้การติดตามเซ็นเซอร์อุปกรณ์ที่กำหนดเองโดยใช้
SensorManager SensorManager จะไม่รับช่วง
Wake Lock ในนามของแอป เว้นแต่เซ็นเซอร์จะเป็นเซ็นเซอร์ปลุก
ซึ่งระบุได้โดยใช้ API isWakeUpSensor
คำแนะนำ
การใช้เซ็นเซอร์เพื่อบันทึกที่อัตราการสุ่มตัวอย่างสูงอาจทำให้แบตเตอรี่หมดเร็วมาก ต่อไปนี้คือคำแนะนำในการลดการใช้แบตเตอรี่และการใช้ Wake Lock
- หากติดตามจำนวนก้าวหรือระยะทางที่เดินทาง ให้ใช้ Recording API เพื่อบันทึกข้อมูลในลักษณะที่ประหยัดแบตเตอรี่
- สำหรับการติดตามเซ็นเซอร์แบบพาสซีฟใน Wear OS ให้ใช้บริการข้อมูลสุขภาพของ Wear เพื่อ เพิ่มประสิทธิภาพการใช้งานแบตเตอรี่
- ลดความถี่ของเซ็นเซอร์ให้น้อยกว่า 200 Hz
- เมื่อลงทะเบียนเซ็นเซอร์กับ
SensorManagerให้กำหนดmaxReportLatencyUsมากกว่า 30 วินาทีเพื่อใช้ตรรกะการจัดกลุ่มเซ็นเซอร์และลดจำนวนการขัดจังหวะที่แอปพลิเคชันได้รับ - หลีกเลี่ยงการใช้ Wake Lock เป็นเวลานานตลอดระยะเวลาการติดตามเซ็นเซอร์ แต่ให้ตั้งเวลาปลุกโดยใช้ AlarmManager เพื่อสำรวจข้อมูลเซ็นเซอร์ทุกๆ 30 วินาทีขึ้นไปแทน
ข้อความ Firebase Cloud (FCM)
ระบบจะรับ Wake Lock ขณะส่งข้อความที่ออกอากาศของ Firebase Cloud Messaging (FCM) ไปยังแอป
ระบบจะปล่อย Wake Lock เมื่อวิธีการ onMessageReceived() ของการออกอากาศ FCM ทำงานเสร็จ
ชื่อ Wake Lock
มีการรับ Wake Lock ที่มีชื่อ GOOGLE_C2DM
คำแนะนำ
เราขอแนะนำให้ปฏิบัติตามแนวทางต่อไปนี้เพื่อเพิ่มประสิทธิภาพลักษณะการทำงานของ FCM
- เพิ่มประสิทธิภาพความถี่ในการนำส่ง FCM
- อย่าใช้ FCM ที่มีลำดับความสำคัญสูง เว้นแต่ข้อความนั้นจำเป็นต้อง นำส่งทันที
onMessageReceived()ให้เสร็จสมบูรณ์โดยเร็วที่สุด ดูข้อมูลเพิ่มเติมได้ที่คำแนะนำเกี่ยวกับ Firebase
JobScheduler
งาน JobScheduler จะได้ล็อกการปลุกระบบขณะดำเนินงานใน เบื้องหลัง ระบบจะระบุการล็อกการปลุกให้กับแอปที่สร้าง Worker
ชื่อ Wake Lock
ชื่อ Wake Lock ที่ JobScheduler ได้รับจะขึ้นอยู่กับเวอร์ชันของระบบ Android ที่ทำงานอยู่และวัตถุประสงค์ของงาน
รายการที่อยู่ในวงเล็บเหลี่ยมคือตัวแปร เช่น "<package_name>" คือชื่อแพ็กเกจของแอป ไม่ใช่ข้อความตามตัวอักษร <package name> อย่างไรก็ตาม *job* คือลำดับอักขระ
*job* ที่มีเครื่องหมายดอกจัน โดยไม่ได้ใช้เครื่องหมายดอกจันเป็นไวลด์การ์ด
Android 15 และต่ำกว่า
งานที่ผู้ใช้เริ่มจะสร้างการล็อกการปลุกที่มีชื่อตามรูปแบบต่อไปนี้
*job*u/@<name_space>@/<package_name>/<classname>
งานอื่นๆ ที่ใช้รูปแบบนี้
*job*/@<name_space>@/<package_name>/<classname>
Android 16 ขึ้นไป
งานที่ผู้ใช้เริ่มจะสร้างการล็อกการปลุกที่มีชื่อตามรูปแบบต่อไปนี้
*job*u/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
งานด่วนใช้รูปแบบต่อไปนี้
*job*e/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
งานปกติจะใช้รูปแบบนี้
*job*r/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
ตัวอย่าง
สมมติว่ามีงานเร่งด่วนที่มีเนมสเปซ backup และแท็กการติดตาม started ชื่อแพ็กเกจคือ com.example.app และคลาสที่
สร้างงานคือ com.backup.BackupFileService
ในอุปกรณ์ที่ใช้ Android 15 หรือต่ำกว่า การล็อกการปลุกจะมีชื่อดังนี้
*job*/@backup@/com.example.app/com.backup.BackupFileService
ในอุปกรณ์ที่ใช้ Android 16 ขึ้นไป การล็อกการปลุกจะมีชื่อดังนี้
*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService
คำแนะนำ
ตรวจสอบการใช้งานงาน JobScheduler โดยเฉพาะอย่างยิ่ง ให้ทำตามคำแนะนำของเราสำหรับการเพิ่มประสิทธิภาพการใช้แบตเตอรี่สำหรับ API การตั้งเวลางาน
ตำแหน่ง
LocationManager และ FusedLocationProviderClient ใช้
การล็อกการปลุกเพื่อรับและส่งตำแหน่งของอุปกรณ์ ระบบจะระบุแหล่งที่มาของ Wake Lock
ไปยังแอปที่เรียก API เหล่านั้น
ชื่อ Wake Lock
บริการตำแหน่งใช้ชื่อต่อไปนี้
CollectionLib-SigCollectorNetworkLocationLocatorNetworkLocationScannerNlpCollectorWakeLockNlpWakeLock*location*
คำแนะนำ
- เพิ่มประสิทธิภาพการใช้ตำแหน่ง เช่น ตั้งค่าการหมดเวลา คำขอตำแหน่งแบบเป็นกลุ่ม หรือใช้การอัปเดตตำแหน่งแบบพาสซีฟ
- หากใช้ Location API คุณไม่จำเป็นต้องรับ Wake Lock โดยตรง แต่สามารถใช้ API เพื่อรับ Wake Lock ที่จำเป็นได้
WorkManager
Worker ของ WorkManager จะได้รับล็อกการปลุกระบบขณะที่ดำเนินการในเบื้องหลัง ระบบจะระบุการล็อกการปลุกให้กับแอปที่สร้าง Worker
ชื่อ Wake Lock
ชื่อ Wake Lock ที่ WorkManager ได้รับจะขึ้นอยู่กับเวอร์ชันของระบบ Android ที่ทำงานอยู่
Android 15 และต่ำกว่า
งาน WorkManager จะสร้างการทำงานขณะล็อกที่มีชื่อตามรูปแบบต่อไปนี้
*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Android 16 ขึ้นไป
งานที่เร่งด่วนจะสร้าง Wake Lock ที่มีชื่อตามรูปแบบต่อไปนี้
*job*e/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
งานปกติจะมีรูปแบบดังนี้
*job*r/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
โดยค่าเริ่มต้น <trace_tag> คือชื่อผู้ปฏิบัติงาน
ตัวอย่าง
สมมติว่ามีผู้ปฏิบัติงานที่เร่งด่วนชื่อ BackupFileWorker ชื่อแพ็กเกจ
คือ com.example.app
ในอุปกรณ์ที่ใช้ Android 15 หรือต่ำกว่า การล็อกการปลุกจะมีชื่อดังนี้
*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
ในอุปกรณ์ที่ใช้ Android 16 ขึ้นไปและใช้ WorkManager 2.10.0+
ระบบจะตั้งชื่อ Wake Lock ดังนี้
*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
คำแนะนำ
- อัปเกรด WorkManager เป็นเวอร์ชันล่าสุดเพื่อให้แท็ก Wake Lock มีรายละเอียดมากขึ้นใน Android 16 ขึ้นไป
- ตรวจสอบการใช้งาน Worker ของ WorkManager โดยเฉพาะอย่างยิ่ง ให้ทำตามคำแนะนำของเรา สำหรับการเพิ่มประสิทธิภาพการใช้แบตเตอรี่สำหรับ API การตั้งเวลางาน
_UNKNOWN
หากเครื่องมือแก้ไขข้อบกพร่องคิดว่าชื่อ Wake Lock มีข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ (PII) เครื่องมือจะไม่แสดงชื่อ Wake Lock จริง แต่จะ
ติดป้ายกำกับการล็อกปลุกเป็น _UNKNOWN แทน เช่น เครื่องมืออาจทำเช่นนี้หากชื่อ Wake
lock มีอีเมล
คำแนะนำ
ทําตามแนวทางปฏิบัติแนะนําในการตั้งชื่อการทํางานขณะล็อก และหลีกเลี่ยงการใช้ PII ในชื่อการทํางานขณะล็อก หากพบ Wake Lock ที่มีชื่อ_UNKNOWNซึ่งเชื่อมโยงกับแอปของคุณ ให้ลอง
ระบุว่า Wake Lock นั้นคืออะไร แล้วตั้งชื่ออื่น