Tam alarm planlama işlemi varsayılan olarak reddedilir

Tam alarmlar, kullanıcılar tarafından bilinçli olarak gönderilen bildirimler veya belirli bir zamanda gerçekleşmesi gereken işlemler için tasarlanmıştır.

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üklenmiş uygulamaların çoğuna verilmeyecek (varsayılan olarak "reddedilecek" şeklinde ayarlanacak). Kullanıcı, uygulama verilerini Android 14 çalıştıran bir cihaza yedekleme ve geri yükleme işlemiyle aktarırsa izin yine de reddedilir. Mevcut bir uygulamada halihazırda bu izin varsa cihaz Android 14'e yükseldiğinde izin de verilir.

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

SCHEDULE_EXACT_ALARM izni için mevcut en iyi uygulamalar hâlâ geçerlidir. Örneğin:

Bu durumdan etkilenen uygulamalar

Bir cihaz Android 14 veya sonraki bir sürümü çalıştırıyorsa bu değişiklik, aşağıdaki özelliklere sahip yeni yüklenmiş bir uygulamayı etkiler:

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

Takvim ve çalar saat uygulamaları şunu bildirmelidir: USE_EXACT_ALARM

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. Bu izne sahip uygulamalar, SCHEDULE_EXACT_ALARM iznine sahip uygulamalar gibi tam alarm planlayabilecektir.

Tam alarm gerektirmeyebilecek kullanım alanları

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

Aşağıdaki listede tam alarm gerektirmeyebilecek, yaygın olarak kullanılan 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ı göz önünde bulundurması gerektiğinde (yarın saat 14:00'te veya 30 dakika içinde devreye girmek gibi) faydalıdır. Aksi takdirde, 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 işler planlama olanağı sunar. İş için ayrıntılı çalışma zamanı tanımlamak üzere bir tekrarlama aralığı ve flexInterval (en az 15 dakika) sağlayabilirsiniz.
Sistem boştayken alarmın yaklaşık bir zamanda çalması gerekir
Süresiz alarm kullanma. Ayrıntılı olarak belirtmek gerekirse, setAndAllowWhileIdle() numaralı telefonu arayın.
Belirli bir süre sonra gerçekleşmesi gereken, kullanıcı tanımlı işlem
Süresiz alarm kullanma. Ayrıntılı olarak belirtmek gerekirse, set() numaralı telefonu arayın.
Belirli bir zaman aralığında gerçekleşebilecek, kullanıcı tanımlı işlem
Süresiz alarm kullanma. Ayrıntılı olarak belirtmek gerekirse, 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 tam alarm planlamadan önce en azından izne sahip olup olmadıklarını kontrol etmelidir. Bu izne sahip olmayan uygulamaların, bir intent çağırarak kullanıcıdan bu izni istemesi gerekir.

Bu, özel bir izin isteme 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. Uygulama söz konusu izne sahip değilse kullanıcılardan izin vermelerini istemek için uygulamanın paket adıyla birlikte ACTION_REQUEST_SCHEDULE_EXACT_ALARM öğesini içeren bir amaç ç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 alarm ayarlayabilir. Kullanıcı bunun yerine izni reddetmişse uygulama deneyiminizi güzelce kötüleştirin. Böylece uygulama, söz konusu izinle korunan bilgiler olmadan kullanıcıya işlevsellik sunacaktır.

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

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

İzni kontrol etmek ve kullanıcının kararlarını onResume() içinde 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 reddi, düzgün bir şekilde düşürülür

Bazı kullanıcılar izin vermeyi reddeder. Bu senaryoda, uygulamaların deneyiminin kalitesini düşürmesini ve yine de kullanım alanlarını belirleyerek olası en iyi yedek kullanıcı deneyimini sağlamaya çaba göstermesini ö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üçler 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.