Tam alarm planlama varsayılan olarak reddedilir

Tam alarmlar, kullanıcıların bilinçli olarak davranması gereken bildirimler veya işlemler için kullanılır. gerçekleşmesidir.

SCHEDULE_EXACT_ALARM, Android 12'de kullanıma sunulan izinle tam alarm planlama özelliği, artık yeni yüklenen çoğu cihaza önceden Android 13 ve sonraki sürümleri hedefleyen uygulamalar (varsayılan olarak "reddedildi" şeklinde ayarlanır). Eğer Kullanıcı, uygulama verilerini Android 14 çalıştıran bir cihaza yedekleme ve geri yükleme işlemini gerçekleştirirseniz izin reddedilecektir. Mevcut bir uygulamada bu izin zaten varsa cihaz Android 14'e yükseltildiğinde önceden verilir.

Tam alarm başlatmak için SCHEDULE_EXACT_ALARM izni gerekir şu API'ler aracılığıyla gerçekleştirilir veya bir SecurityException atılır:

ziyaret edin.

SCHEDULE_EXACT_ALARM izni için mevcut en iyi uygulamalar aşağıdakiler dahil geçerlidir:

Bu durumdan etkilenen uygulamalar

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

  • Android 13 (API düzeyi 33) veya sonraki sürümleri hedefler.
  • Manifest dosyasında SCHEDULE_EXACT_ALARM iznini tanımlar.
  • Muafiyet veya ön bağış senaryosuna dahil değil.
  • Takvim veya alarm uygulaması değildir.

Takvim ve çalar saat uygulamaları USE_EXACT_ALARM değerini bildirmelidir

Takvim veya çalar saat uygulamalarının takvim hatırlatıcıları, uyandırma göndermesi gerekir uygulama durdurulduğunda uyarı gönderir. Bu uygulamalar USE_EXACT_ALARM normal izni isteyebilir. USE_EXACT_ALARM izni yükleme sırasında verilir ve bu izne sahip uygulamalar, SCHEDULE_EXACT_ALARM iznine sahip uygulamalar gibi tam alarmlar planlayabilir.

Tam alarm gerektirmeyen kullanım alanları

Çünkü SCHEDULE_EXACT_ALARM izni artık varsayılan olarak reddedilmiştir ve kullanıcıların ek adımlar gerçekleştirmesi gerekir. Geliştiriciler de kullanım alanlarını değerlendirmeleri ve tam alarmların daha mantıklı olabilir.

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

Uygulamanızın kullanım süresi boyunca tekrarlanan işleri planlama
Görevin anlık olarak takip edilmesi gerekiyorsa set() yöntemi yararlıdır (ör. yarın 14:00'te ya da 30 dakika içinde hareket etmesi) Aksi takdirde, postAtTime() veya postDelayed() yöntemlerini kullanmanız önerilir.
Uygulamanızı güncelleme ve günlük yükleme gibi planlanmış arka plan işleri
WorkManager, zamanlamaya duyarlı periyodik işleri planlama olanağı sunar. Bir sonraki aşamaya geçmeden önce tekrarlama aralığı ve flexInterval (en az 15 dakika) ayrıntılı bir çalışma zamanı tanımlar.
Sistem boştayken alarmın yaklaşık bir zamanda çalmasını istiyorum
Yaklaşık alarm kullanın. setAndAllowWhileIdle() numaralı telefonu arayın.
Belirli bir zamandan sonra gerçekleşmesi gereken, kullanıcı tarafından belirtilen işlem
Tam olmayan alarm kullanma. set() numaralı telefonu arayın.
Kullanıcı tarafından belirtilen ve belirli bir zaman aralığında gerçekleşebilecek işlem
Tam olmayan alarm kullanma. Özellikle setWindow() numaralı telefonu arayın. İzin verilen en kısa aralığın 10 dakika olduğunu unutmayın.

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

Uygulamalar en azından, Google'dan önce izinlerinin olup olmadığını tam alarm planlama. Uygulamaların izni yoksa bir intent çağırarak kullanıcıdan izin istemeleri gerekir.

Bu, özel bir özel istek isteği göndermek için kullanılan standart iş akışıyla izin:

  1. Uygulamalar onaylamak için AlarmManager.canScheduleExactAlarms() numarasını aramalıdır ve gerekli izne sahip olduğunu doğrulamalısınız.
  2. Uygulamanın izni yoksa kullanıcılardan izni vermesini istemek için uygulamanın paket adıyla birlikte ACTION_REQUEST_SCHEDULE_EXACT_ALARM öğesini içeren bir intent çağırın.

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

  3. Şunu dinle: AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED kullanıcının izin vermesi durumunda gönderilen yayınlar.

  4. Kullanıcı uygulamanıza izin verdiyse uygulamanız tam zamanlı alarm ayarlayabilir. Kullanıcı bunun yerine izni reddettiyse yazılımdaki kullanıcı deneyimi sunarak söz konusu izinle korunan bilgilere erişememektedir.

Aşağıdaki kod snippet'i, SCHEDULE_EXACT_ALARM izin:

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()'te 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(...)
   }
}

Reddedilen izin durumunda düzgün bir şekilde düzeyi düşür

Bazı kullanıcılar izin vermeyi reddeder. Bu senaryoda, uygulamaların deneyimi sorunsuz bir şekilde düşürmesini ve kullanım alanlarını tanımlayarak mümkün olan en iyi yedek kullanıcı deneyimini sunmaya çalışmasını ö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 bunu isteyebilirsiniz ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS intent işlemi).

Ön bağışlar

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ızın Alarmlar ve hatırlatıcılar iznini devre dışı bırakın ve uygulamanızın davranışını gözlemleyin.