Harmonogram alarmów precyzyjnych jest domyślnie zabroniony

Dokładne alarmy są przeznaczone do powiadomień wysyłanych przez użytkownika lub do działań, które muszą następować w konkretnym czasie.

SCHEDULE_EXACT_ALARM, wprowadzone w Androidzie 12 uprawnienia do planowania alarmów precyzyjnych, nie jest już wstępnie przyznawane większości nowo zainstalowanych aplikacji kierowanych na Androida 13 i nowsze wersje (domyślnie będzie ono ustawione na „Odmowa”). Jeśli użytkownik prześle dane aplikacji na urządzenie z Androidem 14 w ramach operacji tworzenia kopii zapasowej i przywracania danych, uprawnienia i tak nie będą brane pod uwagę. Jeśli istniejąca aplikacja ma już to uprawnienie, zostanie ono wstępnie przyznane po uaktualnieniu urządzenia do Androida 14.

Uprawnienie SCHEDULE_EXACT_ALARM jest wymagane do inicjowania alarmów precyzyjnych za pomocą tych interfejsów API. W przeciwnym razie zostanie wywołany SecurityException:

Nadal obowiązują dotychczasowe sprawdzone metody dotyczące uprawnienia SCHEDULE_EXACT_ALARM, m.in.:

Aplikacje, w których wystąpiła awaria

Jeśli na urządzeniu działa Android w wersji 14 lub nowszej, ta zmiana będzie miała wpływ na nowo zainstalowaną aplikację o tych cechach:

Aplikacje kalendarza i budzika powinny mieć zadeklarowaną wartość USE_EXACT_ALARM

Aplikacje kalendarza lub budzika muszą wysyłać przypomnienia kalendarza, budzik lub alerty, gdy aplikacja nie jest już uruchomiona. Te aplikacje mogą prosić o normalne uprawnienia USE_EXACT_ALARM. Uprawnienie USE_EXACT_ALARM zostanie przyznane podczas instalacji, a aplikacje z tym uprawnieniem będą mogły planować precyzyjne alarmy tak samo jak aplikacje z uprawnieniem SCHEDULE_EXACT_ALARM.

Przypadki użycia, które mogą nie wymagać alarmów precyzyjnych

Obecnie domyślnie odmowa dostępu do uprawnienia SCHEDULE_EXACT_ALARM jest domyślnie odrzucana, a proces przyznawania uprawnień wymaga od użytkowników dodatkowych czynności, dlatego zdecydowanie zachęcamy deweloperów do oceny swoich przypadków użycia i określenia, czy dokładne alarmy są nadal odpowiednie dla danego przypadku.

Poniższa lista zawiera typowe przepływy pracy, które mogą nie wymagać dokładnego alarmu:

Planowanie zadań powtarzanych przez cały okres dostępności aplikacji
Metoda set() jest przydatna, gdy w zadaniu trzeba pamiętać o ograniczeniach w czasie rzeczywistym, np. jeśli ma ono zostać wyłączone o 14:00 jutro lub za 30 minut. W przeciwnym razie zalecamy użycie metody postAtTime() lub postDelayed().
zaplanowane działania w tle, na przykład aktualizowanie aplikacji i przesyłanie logów.
WorkManager umożliwia zaplanowanie okresowej pracy zależnej od czasu. Możesz podać interwał powtarzania i wartość flexInterval (minimum 15 minut), aby zdefiniować szczegółowy czas działania.
Wymagany jest alarm o przybliżonej godzinie, gdy system jest nieaktywny
Używaj alarmu nieprecyzyjnego. Konkretnie chodzi Ci o setAndAllowWhileIdle().
Określone przez użytkownika działanie, które powinno zostać wykonane po określonym czasie
Używaj alarmu nieprecyzyjnego. Konkretnie chodzi Ci o set().
Określone przez użytkownika działanie, które może zostać wykonane w przedziale czasu
Używaj alarmu nieprecyzyjnego. Konkretnie chodzi Ci o setWindow(). Pamiętaj, że najniższa dozwolona długość okna to 10 minut.

Etapy migracji, aby nadal używać alarmów precyzyjnych

Przed zaplanowaniem precyzyjnego alarmu aplikacje muszą przynajmniej sprawdzić, czy mają odpowiednie uprawnienia. Jeśli aplikacje nie mają tych uprawnień, muszą o niego poprosić użytkownika, wywołując intencję.

Działa to tak samo jak w przypadku standardowego procesu zgłaszania prośby o specjalne uprawnienia:

  1. Aplikacje powinny wywołać metodę AlarmManager.canScheduleExactAlarms(), aby potwierdzić, że ma odpowiednie uprawnienia.
  2. Jeśli aplikacja nie ma tych uprawnień, wywołaj intencję zawierającą ACTION_REQUEST_SCHEDULE_EXACT_ALARM wraz z nazwą pakietu aplikacji, aby poprosić użytkowników o przyznanie tego uprawnienia.

    Sprawdź decyzję użytkownika w metodzie onResume() swojej aplikacji.

  3. Nasłuchiwanie transmisji AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED wysyłanych po przyznaniu uprawnień przez użytkownika.

  4. Jeśli użytkownik przyznał Twojej aplikacji odpowiednie uprawnienia, aplikacja może ustawiać dokładne alarmy. Jeśli użytkownik odmówił przyznania uprawnień, własnoręcznie ogranicz korzystanie z aplikacji, tak aby nie zawierała informacji chronionych przez to uprawnienie.

Ten fragment kodu pokazuje, jak sprawdzić uprawnienie SCHEDULE_EXACT_ALARM:

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

Przykładowy kod służący do sprawdzania uprawnień i podejmowania decyzji użytkownika w onResume():

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

Uprzejmie ustosunkuj się przy odmowie uprawnień

Niektórzy użytkownicy odmawiają przyznania tego uprawnienia. W takiej sytuacji zalecamy użytkownikom płynne pogorszenie działania aplikacji, a jednocześnie staramy się zapewnić użytkownikom jak najlepszą obsługę przez wskazanie przypadków użycia.

Zwolnienia

Poniższe typy aplikacji zawsze mogą wywoływać metody setExact() lub setExactAndAllowWhileIdle():

  • Aplikacje podpisane certyfikatem platformy.
  • Aplikacje z podwyższonymi uprawnieniami.
  • Aplikacje znajdujące się na liście dozwolonych aplikacji (jeśli Twoja aplikacja spełnia wymagania, możesz poprosić o to, używając działania intencji ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).

Przed grantami

Wytyczne dotyczące testowania

Aby przetestować tę zmianę, wyłącz uprawnienie Alarmy i przypomnienia dla swojej aplikacji na stronie Specjalny dostęp do aplikacji w ustawieniach systemu (Ustawienia > Aplikacje > Specjalny dostęp do aplikacji > Alarmy i przypomnienia) i obserwuj działanie swojej aplikacji.