Le sveglie esatte sono pensate per le notifiche o le azioni intenzionali dell'utente che richiedono avvenga in un momento preciso.
SCHEDULE_EXACT_ALARM
, l'autorizzazione introdotta in Android 12 per consentire alle app di
di programmazione di sveglie esatte non viene più pre-concessa alla maggior parte dei casi
le app destinate ad Android 13 e versioni successive (verranno rifiutate per impostazione predefinita). Se
l'utente trasferisce i dati delle app a un dispositivo con Android 14 tramite un'operazione di
backup e ripristino, l'autorizzazione verrà comunque negata. Se un'app esistente dispone già di questa autorizzazione, verrà concessa in anticipo quando il dispositivo eseguirà l'upgrade ad Android 14.
Per avviare sveglie esatte è necessaria l'autorizzazione SCHEDULE_EXACT_ALARM
tramite le API seguenti o verrà restituito un SecurityException
:
Le best practice esistenti per l'autorizzazione SCHEDULE_EXACT_ALARM
continuano a essere valide, tra cui:
- Controlla l'autorizzazione con
canScheduleExactAlarms()
prima di programmare sveglie esatte. - Configura l'app per ascoltare e reagire correttamente alla trasmissione in primo piano
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
, che il sistema invia quando l'utente concede l'autorizzazione.
App interessate
Se un dispositivo utilizza Android 14 o versioni successive, questa modifica interesserà app installata con le seguenti caratteristiche:
- Ha come target Android 13 (livello API 33) o versioni successive.
- Dichiara l'autorizzazione
SCHEDULE_EXACT_ALARM
nel file manifest. - Non rientra in un'esenzione o nella pre-concessione in questo scenario.
- Non è un'app di calendario o sveglia.
Le app di calendario e sveglia devono dichiarare USE_EXACT_ALARM
Le app di calendario o sveglia devono inviare promemoria di calendario, sveglie o avvisi quando l'app non è più in esecuzione. Queste app possono richiedere
Autorizzazione normale USE_EXACT_ALARM
. L'autorizzazione USE_EXACT_ALARM
la licenza viene concessa al momento dell'installazione e le app che dispongono di questa autorizzazione potranno programmare
sveglie esatte, proprio come le app con autorizzazione SCHEDULE_EXACT_ALARM
.
Casi d'uso che potrebbero non richiedere sveglie esatte
Perché ora l'autorizzazione SCHEDULE_EXACT_ALARM
è negata per impostazione predefinita e
il processo di concessione delle autorizzazioni richiede ulteriori passaggi da parte degli utenti,
Ti consigliamo vivamente di valutare i casi d'uso e di determinare se allarmi esatti
che hanno comunque senso per i loro casi d'uso.
Il seguente elenco mostra flussi di lavoro comuni che potrebbero non richiedere un allarme esatto:
- Pianificazione del lavoro ripetuto per tutta la durata dell'app
- Il metodo
set()
è utile se l'attività deve rimanere in tempo reale ai vincoli in mente, come il lancio alle 14:00 di domani o tra 30 minuti. In caso contrario, ti consigliamo di utilizzare lapostAtTime()
opostDelayed()
. - Operazioni in background pianificate, ad esempio l'aggiornamento dell'app e il caricamento dei log
WorkManager
fornisce un modo per pianificare attività periodiche sensibili ai tempi. Puoi fornire un intervallo di ripetizione e un intervallo flexInterval (15 minuti minimo) per puoi definire runtime granulare per il lavoro.- È necessario che la sveglia suoni a un'ora approssimativa quando il sistema è in stato inattivo
- Utilizzare una sveglia non esatta. Nello specifico, chiama il numero
setAndAllowWhileIdle()
. - Azione specificata dall'utente che deve avvenire dopo un'ora specifica
- Usa una sveglia inesatta. In particolare, chiama
set()
. - Azione specificata dall'utente che può verificarsi in un determinato arco di tempo
- Usa una sveglia inesatta. In particolare, chiama
setWindow()
. Tieni presente che la durata minima consentita della finestra è di 10 minuti.
Passaggi di migrazione per continuare a usare le sveglie esatte
Come minimo, le app devono verificare di disporre dell'autorizzazione prima di pianificare sveglie esatte. Se le app non dispongono dell'autorizzazione, devono richiederla all'utente richiamando un intent.
È lo stesso flusso di lavoro standard per richiedere un'autorizzazione speciale:
- Le app devono chiamare il numero
AlarmManager.canScheduleExactAlarms()
per confermare che disponga dell'autorizzazione appropriata. Se l'app non dispone dell'autorizzazione, invoca un'intent che includa
ACTION_REQUEST_SCHEDULE_EXACT_ALARM
, insieme al nome del pacchetto dell'app, per chiedere agli utenti di concedere l'autorizzazione.Controlla la decisione dell'utente nel metodo
onResume()
della tua dell'app.Ascolta le trasmissioni
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
inviate se l'utente concede l'autorizzazione.Se l'utente ha concesso l'autorizzazione alla tua app, quest'ultima può impostare sveglie. Se invece l'utente ha negato l'autorizzazione, esegui il degrado graduale dell'esperienza con l'app in modo da fornire all'utente la funzionalità senza le informazioni protette da quell'autorizzazione.
Il seguente snippet di codice mostra come verificare la presenza di
Autorizzazione 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))
}
}
Codice campione per verificare l'autorizzazione e gestire le decisioni dell'utente in
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(...)
}
}
Riduci delicatamente in caso di rifiuto dell'autorizzazione
Alcuni utenti si rifiuteranno di concedere l'autorizzazione. In questo scenario, consigliamo alle app di eseguire il downgrade dell'esperienza in modo graduale e di continuare a offrire la migliore esperienza utente di riserva possibile identificando i relativi casi d'uso.
Esenzioni
I seguenti tipi di app possono sempre chiamare setExact()
o
Metodi di setExactAndAllowWhileIdle()
:
- App firmate con il certificato della piattaforma.
- App con privilegi.
- Le app inserite nella lista consentita di app dell'alimentazione (se soddisfa i requisiti,
puoi richiederlo utilizzando il
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
azione dell'intent).
Pre-concessioni
- I titolari dei ruoli di
SYSTEM_WELLBEING
verranno pre-concessiSCHEDULE_EXACT_ALARM
Linee guida per i test
Per verificare questa modifica, disattiva Sveglie e ai promemoria per la tua app dalla pagina Accesso speciale per le app nelle impostazioni di sistema (Impostazioni > App > Accesso speciale per le app > Sveglie e promemoria) e osserva il comportamento dell'app.