Koleksiyonlar ile düzeninizi koruyun
İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.
Uyanık kalma kilidi kullanmak cihaz performansını olumsuz etkileyebilir. Wake lock kullanmanız gerekiyorsa bunu doğru şekilde yapmanız önemlidir. Bu belgede, yaygın uyandırma kilidi hatalarından kaçınmanıza yardımcı olabilecek bazı en iyi uygulamalar ele alınmaktadır.
Uyanık kalma kilidini doğru şekilde adlandırın
Paket, sınıf veya yöntem adınızı wakelock etiketine eklemenizi öneririz. Bu sayede, bir hata oluşursa uyandırma kilidinin oluşturulduğu kaynak kodunuzdaki konumu bulmak daha kolay olur. Aşağıda bazı ek ipuçları verilmiştir:
Ad kısmında e-posta adresi gibi kimliği tanımlayabilecek bilgiler (PII) kullanmayın. Cihaz, uyandırma kilidi etiketinde kimliği tanımlayabilecek bilgiler algılarsa belirttiğiniz etiket yerine _UNKNOWN ifadesini günlüğe kaydeder.
Sınıf veya yöntem adını programatik olarak almayın. Örneğin, getName() çağrısı yapmayın. Adı programatik olarak almaya çalışırsanız Proguard gibi araçlar tarafından karartılabilir. Bunun yerine sabit kodlanmış bir dize kullanın.
Uyanık kalma kilidi etiketlerine sayaç veya benzersiz tanımlayıcı eklemeyin. Uyandırma kilidi oluşturan kod her çalıştığında aynı etiketi kullanmalıdır.
Bu uygulama, sistemin her yöntemin uyandırma kilidi kullanımını toplamasına olanak tanır.
Uygulamanızın ön planda göründüğünden emin olun
Uyanık kalma kilidi etkin durumdayken cihaz güç kullanır. Cihazın kullanıcısı bu durumun farkında olmalıdır. Bu nedenle, uyandırma kilidi kullanıyorsanız kullanıcıya bir bildirim göstermeniz gerekir.
Uygulamada bu, uyandırma kilidini bir ön plan hizmetinde alıp tutmanız gerektiği anlamına gelir. Ön plan hizmetlerinin bildirim göstermesi gerekir.
Ön plan hizmeti uygulamanız için doğru seçim değilse muhtemelen uyandırma kilidi de kullanmamalısınız. Uygulamanız ön planda değilken çalışmaya devam etmenin diğer yolları için Cihazı uyanık tutmak için doğru API'yi seçme dokümanlarına bakın.
Mantığı basit tutun
Uyandırma kilitlerini edinme ve serbest bırakma mantığının mümkün olduğunca basit olduğundan emin olun. Uyanık kalma kilidi mantığınız karmaşık durum makinelerine, zaman aşımlarına, yürütücü havuzlarına veya geri çağırma etkinliklerine bağlı olduğunda bu mantıktaki küçük bir hata, uyanık kalma kilidinin beklenenden daha uzun süre tutulmasına neden olabilir. Bu hataların teşhisi ve hata ayıklaması zordur.
Uyanık kalma kilidinin her zaman serbest bırakıldığından emin olun.
Uyanık kalma kilidi kullanıyorsanız aldığınız her uyanık kalma kilidinin düzgün şekilde serbest bırakıldığından emin olmanız gerekir. Bu her zaman göründüğü kadar kolay olmayabilir. Örneğin, aşağıdaki kodda bir sorun var:
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}
Buradaki sorun, doTheWork() yönteminin MyException istisnasına neden olabilmesidir. Bu durumda doSomethingAndRelease() yöntemi istisnayı dışarıya yayar ve release() çağrısına asla ulaşmaz. Sonuç olarak, uyandırma kilidi alınır ancak serbest bırakılmaz. Bu durum çok kötüdür.
Düzeltilmiş kodda, doSomethingAndRelease() bir istisna oluşturulsa bile uyandırma kilidinin serbest bırakılmasını sağlar:
Bu sayfadaki içerik ve kod örnekleri, İçerik Lisansı sayfasında açıklanan lisanslara tabidir. Java ve OpenJDK, Oracle ve/veya satış ortaklarının tescilli ticari markasıdır.
Son güncelleme tarihi: 2025-08-27 UTC.
[[["Anlaması kolay","easyToUnderstand","thumb-up"],["Sorunumu çözdü","solvedMyProblem","thumb-up"],["Diğer","otherUp","thumb-up"]],[["İhtiyacım olan bilgiler yok","missingTheInformationINeed","thumb-down"],["Çok karmaşık / çok fazla adım var","tooComplicatedTooManySteps","thumb-down"],["Güncel değil","outOfDate","thumb-down"],["Çeviri sorunu","translationIssue","thumb-down"],["Örnek veya kod sorunu","samplesCodeIssue","thumb-down"],["Diğer","otherDown","thumb-down"]],["Son güncelleme tarihi: 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 }"]]