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

Uyandırma kilidi kullanmak cihaz performansını olumsuz etkileyebilir. Uyandırma kilidi kullanmanız gerekiyorsa bunu doğru şekilde yapmanız önemlidir. Bu dokümanda, uyandırıcı kilitle ilgili yaygın tuzaklardan kaçınmanıza yardımcı olabilecek bazı en iyi uygulamalar ele alınmaktadır.

Uyanık kalma kilidini doğru şekilde adlandırma

Wakelock etiketine paketinizi, sınıfınızı veya yöntem adınızı eklemenizi öneririz. Bu sayede, bir hata meydana gelirse kaynak kodunuzda uyanma kilidinin oluşturulduğu konumu daha kolay bulabilirsiniz. Aşağıda bazı ek ipuçları verilmiştir:

  • Adda kimliği tanımlayabilecek bilgileri (PII) (ör. e-posta adresi) kaldırın. Cihaz, uyanma kilidi etiketinde kimliği tanımlayabilecek bilgi algılarsa belirttiğiniz etiket yerine _UNKNOWN etiketini günlüğe kaydeder.
  • Sınıf veya yöntem adını programatik olarak (ör. getName()'ü çağırarak) almayın. Adı programatik olarak almaya çalışırsanız Proguard gibi araçlar tarafından karartılabilir. Bunun yerine sabit kodlanmış bir dize kullanın.
  • Uyandırma kilidi etiketlerine sayaç veya benzersiz tanımlayıcı eklemeyin. Uyandırma kilidi oluşturan kod, her çalıştırıldığında aynı etiketi kullanmalıdır. Bu uygulama, sistemin her yöntemin uyanma kilidi kullanımını toplamasına olanak tanır.

Uygulamanızın ön planda göründüğünden emin olun

Uyandırma kilidi etkinken cihaz güç kullanır. Cihazın kullanıcısı, bu işlemin yapıldığını bilmelidir. Bu nedenle, uyanma kilidi kullanıyorsanız kullanıcıya bir bildirim göstermeniz gerekir. Pratikte bu, uyandırıcı kilidi bir ön plan hizmetinde alıp tutmanız gerektiği anlamına gelir. Bildirim göstermek için ön plan hizmetlerinin kullanılması gerekir.

Ön plan hizmeti, uygulamanız için doğru seçim değilse muhtemelen uyanma kilidi de kullanmamanız gerekir. Uygulamanız ön planda değilken çalışmanın 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 alma ve bırakma mantığının mümkün olduğunca basit olduğundan emin olun. Uyandırma 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, uyandırma kilidinin beklenenden daha uzun süre tutulmasına neden olabilir. Bu hataların teşhis edilmesi ve hata ayıklanmaları zordur.

Uyandırma kilidinin her zaman serbest bırakılıp bırakılmadığını kontrol edin

Uyandırma kilidi kullanıyorsanız edindiğiniz her uyandırma kilidinin düzgün şekilde bırakıldığından emin olmanız gerekir. Bu işlem her zaman göründüğü kadar kolay olmayabilir. Örneğin, aşağıdaki kodda bir sorun vardır:

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 istisna hatası vermesi olabilir. Bu durumda doSomethingAndRelease() yöntemi istisnayı dışa doğru iletir ve release() çağrısına hiçbir zaman ulaşmaz. Sonuç olarak, uyanma kilidi elde edilir ancak bırakılmaz. Bu çok kötü bir durumdur.

Düzeltilen kodda doSomethingAndRelease(), istisna atılsa bile uyanma kilidini serbest bıraktığından emin olur:

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