Programlanmış alarmlar varsayılan olarak reddedilir

Tam alarmlar, kullanıcıların bilinçli bildirimleri veya belirli bir zamanda gerçekleşmesi gereken işlemler içindir.

Uygulamaların tam alarm planlamaları için Android 12'de kullanıma sunulan SCHEDULE_EXACT_ALARM izni, artık Android 13 ve sonraki sürümleri hedefleyen yeni yüklenen uygulamaların çoğuna sağlanmamaktadır (varsayılan olarak reddedilir olarak ayarlanacaktır). Kullanıcı, uygulama verilerini bir yedekleme ve geri yükleme işlemiyle Android 14 çalıştıran bir cihaza aktarırsa izin yine de reddedilir. Bu izin mevcut bir uygulamada zaten varsa cihaz Android 14'e yükseltildiğinde bu izin önceden verilir.

Aşağıdaki API'ler aracılığıyla tam alarm başlatmak için SCHEDULE_EXACT_ALARM izni gerekir. Aksi takdirde SecurityException gönderilir:

Aşağıdakiler de dahil olmak üzere SCHEDULE_EXACT_ALARM izniyle ilgili mevcut en iyi uygulamalar geçerli olmaya devam edecektir:

Bu durumdan etkilenen uygulamalar

Bir cihazda Android 14 veya sonraki bir sürüm kullanılıyorsa bu değişiklik, yeni yüklenmiş ve aşağıdaki özelliklere sahip bir uygulamayı etkileyecektir:

  • Android 13 (API düzeyi 33) veya sonraki sürümleri hedefler.
  • Manifest'te SCHEDULE_EXACT_ALARM iznini tanımlar.
  • Muafiyet veya izin öncesi senaryosunun kapsamında değildir.
  • Takvim veya çalar saat uygulaması değildir.

Takvim ve çalar saat uygulamaları USE_EXACT_ALARM belirtmelidir

Takvim veya çalar saat uygulamalarının, uygulama artık çalışmadığında takvim hatırlatıcıları, uyandırma alarmları veya uyarılar göndermesi gerekir. Bu uygulamalar USE_EXACT_ALARM normal iznini isteyebilir. Yükleme sırasında USE_EXACT_ALARM izni verilir ve bu izne sahip uygulamalar, SCHEDULE_EXACT_ALARM iznine sahip uygulamalar gibi tam alarm planlayabilecek.

Tam alarm gerektirmeyebilecek kullanım alanları

SCHEDULE_EXACT_ALARM izni artık varsayılan olarak reddedildiğinden ve izin verme sürecinde kullanıcıların ekstra adımlar gerçekleştirmesi gerektiğinden, geliştiricilerin kullanım alanlarını değerlendirmeleri ve kullanım alanları için tam alarmların hâlâ uygun olup olmadığını belirlemeleri önemle tavsiye edilmektedir.

Aşağıdaki listede, tam alarm gerektirmeyebilecek yaygın iş akışları gösterilmektedir:

Uygulamanızın kullanım süresi boyunca tekrarlanan işleri planlama
set() yöntemi, görevin gerçek zamanlı kısıtlamaları dikkate alması gerekiyorsa (ör. yarın saat 14:00'te veya 30 dakika sonra devreye girecekse) kullanışlıdır. Diğer durumlarda bunun yerine postAtTime() veya postDelayed() yöntemlerini kullanmanız önerilir.
Uygulamanızı güncelleme ve günlükleri yükleme gibi planlı arka plan çalışmaları
WorkManager, zamanlamaya duyarlı periyodik çalışmalar planlamak için bir yöntem sunar. İş için ayrıntılı çalışma zamanı tanımlamak amacıyla bir tekrar aralığı ve flexInterval (en az 15 dakika) sağlayabilirsiniz.
Sistem boştayken alarmın yaklaşık bir zamanda çalması gerekir
Değişken zamanlı alarm kullanma. Özellikle, setAndAllowWhileIdle() numaralı telefonu arayın.
Kullanıcı tarafından belirtilen ve belirli bir süre sonra yapılması gereken işlem
Değişken zamanlı alarm kullanma. Özellikle, set() numaralı telefonu arayın.
Belirli bir zaman aralığında gerçekleşebilecek, kullanıcı tarafından belirlenen işlem
Değişken zamanlı alarm kullanma. Özellikle, setWindow() numaralı telefonu arayın. İzin verilen en küçük pencere uzunluğunun 10 dakika olduğunu unutmayın.

Tam alarm kullanmaya devam etmek için taşıma adımları

Uygulamalar en azından, tam alarm planlamadan önce izne sahip olup olmadığını kontrol etmelidir. Uygulamaların izni yoksa bir intent çağırarak kullanıcıdan bu izni istemesi gerekir.

Bu, özel izin isteme için kullanılan standart iş akışıyla aynıdır:

  1. Uygulamalar, uygun izne sahip olduğunu onaylamak için AlarmManager.canScheduleExactAlarms()'i çağırmalıdır.
  2. Uygulamanın izni yoksa kullanıcılardan izin vermelerini istemek için uygulamanın paket adıyla birlikte ACTION_REQUEST_SCHEDULE_EXACT_ALARM öğesini içeren bir niyet çağırın.

    Uygulamanızın onResume() yönteminde kullanıcının kararını kontrol edin.

  3. Kullanıcı izin verirse gönderilen AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED yayınlarını dinleyin.

  4. Kullanıcı uygulamanıza izin verdiyse uygulamanız tam alarmlar ayarlayabilir. Kullanıcı izni reddederse uygulama deneyiminizi zarifçe düşürerek, izinle korunan bilgiler olmadan kullanıcıya işlevsellik kazandırın.

Aşağıdaki kod snippet'inde, SCHEDULE_EXACT_ALARM izninin nasıl kontrol edileceği gösterilmektedir:

val alarmManager: AlarmManager = context.getSystemService<AlarmManager>()!!
when {
   // If permission is granted, proceed with scheduling exact alarms.
   alarmManager.canScheduleExactAlarms() -> {
       alarmManager.setExact(...)
   }
   else -> {
       // Ask users to go to exact alarm page in system settings.
       startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
   }
}

onResume() ürününde izni kontrol etmek ve kullanıcının kararlarını işlemek için örnek kod:

override fun onResume() {
   …  
   if (alarmManager.canScheduleExactAlarms()) {
       // Set exact alarms.
       alarmManager.setExact(...)
   }
   else {
       // Permission not yet approved. Display user notice and revert to a fallback  
       // approach.
       alarmManager.setWindow(...)
   }
}

İzin reddedildiğinde kaliteyi olumsuz yönde düşürme

Bazı kullanıcılar izni vermeyi reddeder. Bu senaryoda, deneyimleri sorunsuz bir şekilde düşürmesi için uygulamalara öncelik vermenizi ve yine de kullanım alanlarını belirleyerek olası en iyi yedek kullanıcı deneyimini sunmaya çalışmanızı öneririz.

Muafiyetler

Aşağıdaki uygulama türlerinin setExact() veya setExactAndAllowWhileIdle() yöntemlerini çağırmasına her zaman izin verilir:

  • Platform sertifikasıyla imzalanmış uygulamalar.
  • Ayrıcalıklı uygulamalar.
  • Güç izin verilenler listesindeki uygulamalar (uygulamanız şartlara uygunsa ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS intent işlemini kullanarak bunu isteyebilirsiniz).

Ön hibeler

Test yönergeleri

Bu değişikliği test etmek için sistem ayarlarındaki Özel uygulama erişimi sayfasından (Ayarlar > Uygulamalar > Özel uygulama erişimi > Alarmlar ve hatırlatıcılar) uygulamanıza ilişkin Alarmlar ve hatırlatıcılar iznini devre dışı bırakın ve uygulamanızın davranışını gözlemleyin.