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.:
- Zanim zaplanujesz alarmy precyzyjne, sprawdź uprawnienia w
canScheduleExactAlarms()
. - Skonfiguruj aplikację tak, aby nasłuchiwała i właściwie reagowała na komunikaty
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
wysyłane przez system, gdy użytkownik przyzna na to odpowiednie uprawnienia.
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:
- Aplikacja jest kierowana na Androida 13 (poziom interfejsu API 33) lub nowszego.
- Deklaruje uprawnienie
SCHEDULE_EXACT_ALARM
w pliku manifestu. - Nie podlega wyjątkowi ani wstępnemu udzieleniem uprawnień.
- To nie jest aplikacja kalendarza ani budzika.
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 metodypostAtTime()
lubpostDelayed()
. - 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:
- Aplikacje powinny wywołać metodę
AlarmManager.canScheduleExactAlarms()
, aby potwierdzić, że ma odpowiednie uprawnienia. 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.Nasłuchiwanie transmisji
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
wysyłanych po przyznaniu uprawnień przez użytkownika.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
- Właściciele ról
SYSTEM_WELLBEING
zostaną wstępnie przyznanySCHEDULE_EXACT_ALARM
.
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.