Aşırı sayıda wakeup

Uyandırmalar, AlarmManager API'deki bir mekanizmadır. Bu mekanizma, geliştiricilerin bir cihazı belirli bir saatte uyandırmak için alarm ayarlamasına olanak tanır. Uygulamanız, RTC_WAKEUP veya ELAPSED_REALTIME_WAKEUP işaretiyle AlarmManager uygulamasındaki set() yöntemlerinden birini çağırarak uyandırma alarmı ayarlar. Uyandırma alarmı tetiklendiğinde, cihaz düşük güç modundan çıkar ve alarmın onReceive() veya onAlarm() yöntemini çalıştırırken kısmi uyanık kalma kilidi çalıştırır. Uyandırma alarmları aşırı derecede tetiklenirse cihazın pilini bitirebilir.

Android, uygulama kalitesini iyileştirmenize yardımcı olmak için uygulamaları aşırı sayıda uyandırma alarmlarına karşı otomatik olarak izler ve bilgileri Android vitals'da gösterir. Verilerin nasıl toplandığı hakkında bilgi edinmek için Play Console belgelerine göz atın.

Uygulamanız cihazı çok sık uyandırıyorsa sorunu teşhis etmek ve düzeltmek için bu sayfadaki talimatları kullanabilirsiniz.

Sorunu çöz

AlarmManager, Android platformunun ilk sürümlerinde kullanıma sunulmuştu ancak daha önce AlarmManager gerektiren birçok kullanım alanı, zaman içinde WorkManager gibi yeni özellikler tarafından daha iyi hizmet vermeye başladı. Bu bölümde, uyandırma alarmlarını azaltmayla ilgili ipuçları yer alır ancak en iyi uygulamalar bölümündeki önerileri uygulamak için uzun vadede uygulamanızı taşımanız önerilir.

Uygulamanızda uyandırma alarmları programladığınız yerleri belirleyin ve bu alarmların tetiklenme sıklığını azaltın. Aşağıda bazı ipuçlarını görebilirsiniz:

  • AlarmManager içinde RTC_WAKEUP veya ELAPSED_REALTIME_WAKEUP işaretini içeren çeşitli set() yöntemlerine yapılan çağrıları arayın.

  • Paketinizin, sınıfınızın veya yönteminizin adını alarmınızın etiket adına eklemenizi öneririz. Böylece, kaynağınızda alarmın ayarlandığı konumu kolayca belirleyebilirsiniz. Aşağıda bazı ek ipuçları verilmiştir:

    • Ada e-posta adresi gibi kimliği tanımlayabilecek bilgiler (PII) eklemeyin. Aksi takdirde cihaz, alarm adı yerine _UNKNOWN günlüğe kaydeder.
    • Sınıf veya yöntem adını programatik olarak almayın (örneğin, getName() yöntemini çağırarak) ProGuard tarafından kod karartılabilir. Bunun yerine sabit kodlanmış bir dize kullanın.
    • Alarm etiketlerine sayaç veya benzersiz tanımlayıcılar eklemeyin. Hepsinin benzersiz tanımlayıcıları olduğundan sistem, bu şekilde ayarlanan alarmları toplayamaz.

Sorunu düzelttikten sonra aşağıdaki ADB komutunu çalıştırarak uyandırma alarmlarınızın beklendiği gibi çalıştığını doğrulayın:

adb shell dumpsys alarm

Bu komut, cihazdaki alarm sistemi hizmetinin durumu hakkında bilgi sağlar. Daha fazla bilgi için dumpsys bölümüne bakın.

En iyi uygulamalar

Uyandırma alarmlarını yalnızca uygulamanızın kullanıcıya yönelik bir işlem (bildirim yayınlama veya kullanıcıyı uyarma gibi) yapması gerektiğinde kullanın. AlarmManager en iyi uygulamalarının listesi için Alarm Planlama konusuna bakın.

Arka plan görevlerini, özellikle de tekrarlanan veya ağ arka plan görevlerini planlamak için AlarmManager kullanmayın. Aşağıdaki avantajları sunduğu için arka plan görevlerini planlamak için WorkManager'ı kullanın:

  • toplu işleme - pil tüketiminin azaltılması için işler birleştirilir
  • kalıcılık - cihaz yeniden başlatılırsa planlanan WorkManager işleri, yeniden başlatma bittikten sonra çalışır
  • kriterler: İşler, cihazın şarj olup olmadığı veya kablosuz ağ mevcut olup olmadığı gibi koşullara göre çalıştırılabilir.

Daha fazla bilgi için Arka planda işleme rehberini inceleyin.

Yalnızca uygulama çalışırken geçerli olan zamanlama işlemlerini planlamak için AlarmManager kullanmayın (başka bir deyişle, zamanlama işlemi kullanıcı uygulamadan çıktığında iptal edilmelidir). Bu gibi durumlarda, kullanımı daha kolay ve çok daha verimli olduğu için Handler sınıfını kullanın.