Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Menggunakan penguncian layar saat aktif dapat menurunkan performa perangkat. Jika Anda perlu menggunakan kunci
pintar, Anda harus melakukannya dengan benar. Dokumen ini membahas beberapa praktik terbaik yang dapat membantu Anda menghindari kesalahan umum terkait kunci tetap aktif.
Beri nama penguncian layar saat aktif dengan benar
Sebaiknya sertakan nama paket, class, atau metode di tag
penguncian layar saat aktif. Dengan begitu, jika terjadi error, akan lebih mudah menemukan lokasi di kode sumber tempat wake lock dibuat. Berikut ini beberapa tips tambahan:
Kosongkan informasi identitas pribadi (PII) dalam nama,
seperti alamat email. Jika perangkat mendeteksi PII di tag penguncian layar saat aktif, perangkat akan mencatat _UNKNOWN, bukan tag yang Anda tentukan.
Jangan mendapatkan nama class atau metode secara terprogram, misalnya dengan
memanggil getName(). Jika Anda mencoba mendapatkan nama secara terprogram, nama tersebut mungkin diobfuscate oleh alat seperti Proguard. Sebaiknya gunakan string
hard code.
Jangan menambahkan penghitung atau ID unik ke tag penguncian layar saat aktif. Kode yang membuat kunci tetap aktif harus menggunakan tag yang sama setiap kali dijalankan.
Praktik ini memungkinkan sistem menggabungkan penggunaan kunci tetap aktif setiap metode.
Pastikan aplikasi Anda terlihat di latar depan
Saat penguncian layar saat aktif diaktifkan, perangkat menggunakan daya. Pengguna perangkat
harus mengetahui bahwa hal ini sedang terjadi. Oleh karena itu, jika Anda menggunakan
penguncian layar saat aktif, Anda harus menampilkan beberapa notifikasi kepada pengguna.
Dalam praktiknya, ini berarti Anda harus mendapatkan dan menahan wakelock di
layanan latar depan. Layanan latar depan diwajibkan untuk menampilkan
notifikasi.
Jika layanan latar depan bukan pilihan yang tepat untuk aplikasi Anda, Anda mungkin juga tidak boleh menggunakan kunci tetap aktif. Lihat dokumentasi
Memilih API yang tepat untuk menjaga perangkat tetap aktif
untuk mengetahui cara lain melakukan pekerjaan saat aplikasi Anda tidak berada di latar depan.
Buat logika tetap sederhana
Pastikan logika untuk mendapatkan dan melepaskan penguncian layar saat aktif sesederhana
mungkin. Saat logika penguncian layar saat aktif dikaitkan ke mesin yang memiliki kompleks, waktu tunggu,
gabungan eksekusi, atau peristiwa callback, bug halus dalam logika tersebut dapat menyebabkan
penguncian layar saat aktif ditahan lebih lama daripada yang diharapkan. Bug ini sulit didiagnosis dan didebug.
Pastikan penguncian layar saat aktif selalu dilepaskan
Jika Anda menggunakan penguncian layar saat aktif, Anda harus memastikan bahwa setiap penguncian layar saat aktif yang Anda peroleh dilepaskan dengan benar. Hal ini tidak selalu semudah yang dibayangkan. Misalnya, kode berikut memiliki masalah:
Kotlin
@Throws(MyException::class)fundoSomethingAndRelease(){wakeLock.apply{acquire()doTheWork()// can potentially throw MyExceptionrelease()// does not run if an exception is thrown}}
Java
voiddoSomethingAndRelease()throwsMyException{wakeLock.acquire();doTheWork();// can potentially throw MyExceptionwakeLock.release();// does not run if an exception is thrown}
Masalahnya di sini adalah metode doTheWork() dapat memunculkan pengecualian
MyException. Jika ya, metode doSomethingAndRelease() akan menyebarkan
pengecualian ke luar, dan tidak akan pernah mencapai panggilan release(). Akibatnya, kunci tetap aktif diperoleh, tetapi tidak dilepaskan, yang sangat buruk.
Dalam kode yang telah diperbaiki, doSomethingAndRelease() memastikan untuk melepaskan
wake lock meskipun pengecualian ditampilkan:
Konten dan contoh kode di halaman ini tunduk kepada lisensi yang dijelaskan dalam Lisensi Konten. Java dan OpenJDK adalah merek dagang atau merek dagang terdaftar dari Oracle dan/atau afiliasinya.
Terakhir diperbarui pada 2025-08-27 UTC.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Informasi yang saya butuhkan tidak ada","missingTheInformationINeed","thumb-down"],["Terlalu rumit/langkahnya terlalu banyak","tooComplicatedTooManySteps","thumb-down"],["Sudah usang","outOfDate","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Masalah kode / contoh","samplesCodeIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 2025-08-27 UTC."],[],[],null,["Using a wake lock can impair device performance. If you need to use a wake\nlock, it's important to do it properly. This document covers some best practices\nthat can help you avoid common wake lock pitfalls.\n| **Note:** Creating and holding wake locks can have a dramatic impact on the device's battery life. You shouldn't use wake locks if there are any suitable alternatives. For other options, see the [Keep the device awake](/develop/background-work/background-tasks/awake) documentation. If you do need to use a wake lock, make sure to hold it for as short a time as possible.\n\nName the wake lock properly\n\nWe recommend including your package, class, or method name in the wakelock\ntag. That way, if an error occurs, it's easier to find the location in your\nsource code where the wake lock was created. Here are some additional tips:\n\n- Leave out any personally identifying information (PII) in the name, such as an email address. If the device detects PII in the wake lock tag, it logs `_UNKNOWN` instead of the tag you specified.\n- Don't get the class or method name programmatically, for example by calling `getName()`. If you try to get the name programmatically, it might get obfuscated by tools like Proguard. Instead use a hard-coded string.\n- Don't add a counter or unique identifiers to wake lock tags. The code that creates a wake lock should use the same tag every time it runs. This practice enables the system to aggregate each method's wake lock usage.\n\nMake sure your app is visible in the foreground\n\nWhile a wake lock is active, the device is using power. The device's user\nshould be aware that this is going on. For this reason, if you're using a\nwake lock, you should display some notification to the user.\nIn practice, this means you should get and hold the wakelock in a\n[foreground service](/develop/background-work/services/fgs). Foreground services are required to display\na notification.\n\nIf a foreground service isn't the right choice for your app,\nyou probably shouldn't be using a wake lock, either. See the\n[Choose the right API to keep the device awake](/develop/background-work/background-tasks/awake)\ndocumentation for other ways to do work while your app isn't in the foreground.\n\nKeep the logic simple\n\nMake sure the logic for acquiring and releasing wake locks is as simple as\npossible. When your wake lock logic is tied to complex state machines, timeouts,\nexecutor pools, or callback events, any subtle bug in that logic can cause the\nwake lock to be held longer than expected. These bugs are difficult to diagnose\nand debug.\n\nCheck that the wake lock is always released\n\nIf you use a wake lock, you must make sure that every wake lock you acquire\nis properly released. This isn't always as easy as it sounds. For example,\nthe following code has a problem: \n\nKotlin \n\n @Throws(MyException::class)\n fun doSomethingAndRelease() {\n wakeLock.apply {\n acquire()\n doTheWork() // can potentially throw MyException\n release() // does not run if an exception is thrown\n }\n }\n\nJava \n\n void doSomethingAndRelease() throws MyException {\n wakeLock.acquire();\n doTheWork(); // can potentially throw MyException\n wakeLock.release(); // does not run if an exception is thrown\n }\n\nThe problem here is that the method `doTheWork()` can throw the exception\n`MyException`. If it does, the `doSomethingAndRelease()` method propagates\nthe exception outward, and it never reaches the `release()` call. The result\nis that the wake lock is acquired but not released, which is very bad.\n\nIn the corrected code, `doSomethingAndRelease()` makes sure to release the\nwake lock even if an exception is thrown: \n\nKotlin \n\n @Throws(MyException::class)\n fun doSomethingAndRelease() {\n wakeLock.apply {\n try {\n acquire()\n doTheWork()\n } finally {\n release()\n }\n }\n }\n\nJava \n\n void doSomethingAndRelease() throws MyException {\n try {\n wakeLock.acquire();\n doTheWork();\n } finally {\n wakeLock.release();\n }\n }"]]