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 uygun ş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 (PII) 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 herhangi bir küçük 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)
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
}
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:
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();
}
}