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:
- Tam alarm planlamadan önce
canScheduleExactAlarms()
ile izni kontrol edin. - Uygulamanızı, kullanıcı izin verdiğinde sistemin gönderdiği ön plan yayınını
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
dinleyecek ve bu yayına doğru şekilde tepki verecek şekilde ayarlayın.
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 yerinepostAtTime()
veyapostDelayed()
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:
- Uygulamalar, uygun izne sahip olduğunu onaylamak için
AlarmManager.canScheduleExactAlarms()
'i çağırmalıdır. 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.Kullanıcı izin verirse gönderilen
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
yayınlarını dinleyin.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
SYSTEM_WELLBEING
rol sahiplerine öncedenSCHEDULE_EXACT_ALARM
verilecektir.
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.