Precyzyjne alarmy są przeznaczone dla powiadomień z zamiarem użytkownika lub działań, które wymagają w określonym momencie.
SCHEDULE_EXACT_ALARM
, uprawnienie wprowadzone w Androidzie 12, które pozwala aplikacjom na planowanie dokładnych alarmów, nie jest już przyznawane domyślnie większości nowo zainstalowanych aplikacji kierowanych na Androida 13 i nowszych (domyślnie będzie odrzucone). Jeśli użytkownik przeniesie dane aplikacji na urządzenie z Androidem 14 podczas operacji tworzenia kopii zapasowej i przywracania, uprawnienia nadal zostaną odrzucone. Jeśli
istniejąca aplikacja ma już to uprawnienie, zostanie ono przyznane wstępnie, gdy urządzenie
aktualizacji do Androida 14.
Do inicjowania alarmów precyzyjnych wymagane jest uprawnienie SCHEDULE_EXACT_ALARM
za pomocą tych interfejsów API lub zostanie zgłoszone SecurityException
:
Nadal obowiązują sprawdzone metody dotyczące uprawnienia SCHEDULE_EXACT_ALARM
, w tym:
- Przed zaplanowaniem alarmów precyzyjnych sprawdź uprawnienia w
canScheduleExactAlarms()
. - Skonfiguruj aplikację tak, aby słuchała i odpowiednio reagowała na transmisję na pierwszym planie
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
, którą system wysyła, gdy użytkownik udzieli uprawnień.
Aplikacje, w których wystąpiła awaria
Jeśli na urządzeniu działa Android 14 lub nowszy, ta zmiana będzie mieć wpływ zainstalowana aplikacja, która ma te cechy:
- kierować ją na Androida 13 (poziom API 33) lub nowszego.
- Deklaruje w pliku manifestu uprawnienia
SCHEDULE_EXACT_ALARM
. - nie podlega wyjątkowi ani wstępnemu przyznaniu;
- nie jest aplikacją kalendarza ani budzika.
Aplikacje kalendarza i budzika powinny deklarować uprawnienie USE_EXACT_ALARM.
Aplikacje kalendarza lub budzika muszą wysyłać przypomnienia z kalendarza lub budzik.
alarmy czy alerty, gdy aplikacja nie jest już uruchomiona. Te aplikacje mogą prosić o normalne uprawnienia USE_EXACT_ALARM
. Uprawnienia USE_EXACT_ALARM
zostaną przyznane podczas instalacji, a aplikacje z tymi uprawnieniami będą mogły planować dokładne alarmy tak samo jak aplikacje z uprawnieniami SCHEDULE_EXACT_ALARM
.
Przypadki użycia, które mogą nie wymagać alarmów precyzyjnych
Ponieważ teraz uprawnienia SCHEDULE_EXACT_ALARM
są domyślnie odrzucane,
proces udzielania uprawnień wymaga od użytkowników dodatkowych czynności,
Zdecydowanie zachęca do oceny ich przypadków użycia i określenia, czy alarmy precyzyjne
które nadal mają sens w ich zastosowaniach.
Na liście poniżej znajdziesz typowe przepływy pracy, które mogą nie wymagać dokładnego alarmu:
- planowanie powtarzających się działań w trakcie trwania aplikacji;
- Metoda
set()
jest przydatna, jeśli zadanie musi być wykonywane z uwzględnieniem ograniczeń czasu rzeczywistego, np. ma się zakończyć jutro o 20:00 lub za 30 minut. W przeciwnym razie zalecamy użycie metodypostAtTime()
lubpostDelayed()
. - zaplanowane działanie w tle, takie jak aktualizowanie aplikacji i przesyłanie dzienników;
WorkManager
umożliwia planowanie prac okresowych, w przypadku których czas jest istotny. Możesz podać interwał powtarzania i flexInterval (minimum 15 minut), aby oraz zdefiniować szczegółowe środowisko wykonawcze dla danej pracy.- Alarm musi zostać uruchomiony o przybliżonej godzinie, gdy system jest w stanie bezczynności
- Użyj alarmu nieprecyzyjnego. a konkretnie – wywołaj
setAndAllowWhileIdle()
. - działanie określone przez użytkownika, które powinno nastąpić po określonym czasie;
- Użyj alarmu nieprecyzyjnego. a konkretnie – wywołaj
set()
. - Określone przez użytkownika działanie, które może wystąpić w określonym przedziale czasu
- Użyj alarmu nieprecyzyjnego. W szczególności zadzwoń pod numer
setWindow()
. Pamiętaj, że minimalna dozwolona długość okna to 10 minut.
Kroki migracji, aby nadal używać alarmów precyzyjnych
Przed zaplanowaniem alarmu precyzyjnego aplikacje muszą co najmniej sprawdzić, czy mają to uprawnienie. Jeśli aplikacja nie ma uprawnień, musi poprosić o nie użytkownika, wywołując intencję.
Jest to ten sam proces co w przypadku standardowego żądania specjalnego uprawnienia:
- Aplikacje powinny wywołać usługę
AlarmManager.canScheduleExactAlarms()
, aby potwierdzić, że mają odpowiednie uprawnienia. Jeśli aplikacja nie ma uprawnienia, wywołaj intencję, która zawiera
ACTION_REQUEST_SCHEDULE_EXACT_ALARM
oraz nazwę pakietu aplikacji, aby poprosić użytkowników o przyznanie uprawnienia.Sprawdź decyzję użytkownika w metodzie
onResume()
aplikacji.Słuchaj
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
transmisji, które są wysyłane, jeśli użytkownik przyzna uprawnienia.Jeśli użytkownik przyznał aplikacji odpowiednie uprawnienia, może ona ustawiać dokładne alarmów. Jeśli użytkownik odmówi udzielenia uprawnień, zmniejsz funkcjonalność aplikacji, aby udostępniała użytkownikowi funkcje bez informacji chronionych przez te uprawnienia.
Fragment kodu poniżej 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 do sprawdzania uprawnień i obsługi decyzji użytkownika w plikach 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(...)
}
}
Sprytnie poniżaj w przypadku odmowy uprawnień
Niektórzy użytkownicy mogą odmówić przyznania uprawnień. W takim przypadku zalecamy aby płynnie wpływać na wygodę użytkowników, i jednocześnie staramy się zapewniać najlepsze możliwe wrażenia użytkowników zastępczych, identyfikując ich przypadki użycia.
Wyjątki
Poniższe typy aplikacji zawsze mogą wywoływać metodę setExact()
lub
setExactAndAllowWhileIdle()
metod:
- Aplikacje podpisane certyfikatem platformy.
- Aplikacje z podwyższonymi uprawnieniami.
- Aplikacje, które znajdują się na liście zezwalającej na korzystanie z możliwości (jeśli Twoja aplikacja spełnia wymagania, możesz poprosić o to za pomocą działania intencyjnego
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
).
Przed uwierzytelnieniem
- Posiadacze roli
SYSTEM_WELLBEING
otrzymają wstępnie przyznane uprawnieniaSCHEDULE_EXACT_ALARM
.
Wskazówki dotyczące testowania
Aby przetestować tę zmianę, wyłącz funkcję Alarmy i uprawnienia do przypomnień dla aplikacji. ze strony Aplikacje ze specjalnym dostępem w ustawieniach systemowych (Ustawienia > Aplikacje > Aplikacje ze specjalnym dostępem > Alarmy i przypomnienia) i obserwuj jej działanie.