Uyandırma kilidi en iyi uygulamalarını takip edin

Uyanık kalma kilidi kullanmak cihaz performansını olumsuz etkileyebilir. Uyanık kalma kilidi kullanmanız gerekiyorsa bunu doğru şekilde yapmanız önemlidir. Bu dokümanda, uyanık kalma kilidiyle ilgili yaygın hatalardan kaçınmanıza yardımcı olabilecek bazı en iyi uygulamalar ele alınmaktadır.

Uyanık kalma kilidini doğru şekilde adlandırın

Wakelock etiketine paket, sınıf veya yöntem adınızı eklemenizi öneririz. Böylece, bir hata oluşursa uyanık kalma kilidinin oluşturulduğu konumu kaynak kodunuzda bulmak daha kolay olur. Aşağıda bazı ek ipuçları verilmiştir:

  • Ad kısmında, e-posta adresi gibi kişisel verilere (PII) yer vermeyin. Cihaz, uyanık kalma kilidi etiketinde kimliği tanımlayabilecek bilgiler algılarsa belirttiğiniz etiket yerine _UNKNOWN değerini günlüğe kaydeder.
  • Sınıf veya yöntem adını programatik olarak (ör. getName() yöntemini çağırarak) almayın. Adı programatik olarak almaya çalışırsanız Proguard gibi araçlar tarafından gizlenebilir. Bunun yerine sabit kodlu bir dize kullanın.
  • Uyanık kalma kilidi etiketlerine sayaç veya benzersiz tanımlayıcılar 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ını sağlar.

Uygulamanızın ön planda görünür olduğundan emin olun.

Uyanık kalma kilidi etkinken cihaz güç kullanır. Cihazın kullanıcısı, bu işlemin gerçekleştirildiğinin farkında olmalıdır. Bu nedenle, uyanık kalma kilidi kullanıyorsanız kullanıcıya bir bildirim göstermeniz gerekir. Uygulamada bu, uyanık kalma 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 işlem yapmanın diğer yolları için Cihazı uyanık tutmak için doğru API'yi seçme başlıklı dokümanı inceleyin.

Mantığı basit tutun

Uyanık kalma kilitlerini alma 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ı teşhis etmek ve ayıklamak zordur.

Uyanık kalma kilidinin her zaman serbest bırakıldığından emin olun

Uyanık kalma kilidi kullanıyorsanız edindiğiniz 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 değildir. Ö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ını oluşturabilmesidir. Öyleyse doSomethingAndRelease() yöntemi, istisnayı dışarı 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 çok kötü bir durumdur.

Düzeltilen 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();
    }
}