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 uyanık kalma 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 kişisel veri (PII) kullanmayın. Cihaz, uyandırma kilidi etiketinde kimliği tanımlayabilecek bilgiler algılarsa belirttiğiniz etiket yerine
_UNKNOWNifadesini kaydeder. - Sınıf veya yöntem adını programatik olarak almayın (ör.
getName()yöntemini çağırarak). 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. Uyanık kalma kilidi oluşturan kod her çalıştığında aynı etiketi kullanmalıdır. Bu uygulama, sistemin her yöntemin uyanık kalma 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, uyanık kalma 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.
Uygulamanız için ön plan hizmeti doğru seçim değilse muhtemelen uyanık kalma kilidi de kullanmamanız gerekir. Uygulamanız ön planda değilken çalışmaya devam etmenin diğer yolları için Cihazın uyanık kalmasını sağlamak 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 tutma 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 tutma 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ı oluşturabilmesidir. Bu durumda doSomethingAndRelease() yöntemi istisnayı dışarıya doğru yayar ve istisna hiçbir zaman release() çağrısına ulaşmaz. Sonuç olarak, uyanık kalma 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 uyanık kalma 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();
}
}