Le sveglie esatte sono concepite per notifiche create dall'utente o azioni che devono verificarsi in un momento specifico.
SCHEDULE_EXACT_ALARM
, l'autorizzazione introdotta in Android 12 per la programmazione di sveglie esatte non viene più concessa in anticipo alla maggior parte delle app appena installate che hanno come target Android 13 e versioni successive (sarà impostata su negata per impostazione predefinita). Se l'utente trasferisce i dati dell'app su 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, questa verrà concessa in anticipo quando il dispositivo
eseguirà l'upgrade ad Android 14.
L'autorizzazione SCHEDULE_EXACT_ALARM
è necessaria per avviare allarmi esatti
tramite le seguenti API, altrimenti verrà generato un SecurityException
:
Le best practice esistenti per l'autorizzazione SCHEDULE_EXACT_ALARM
continuano a essere applicate, tra cui:
- Prima di pianificare
sveglie esatte, verifica l'autorizzazione con
canScheduleExactAlarms()
. - Configura l'app in modo che ascolti e reagisca 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 su un dispositivo è installato Android 14 o versioni successive, questa modifica interesserà un'app appena installata con le seguenti caratteristiche:
- Ha come target Android 13 (livello API 33) o versioni successive.
- Dichiara l'autorizzazione
SCHEDULE_EXACT_ALARM
nel manifest. - Non rientra in uno scenario di esenzione o pre-granting.
- 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 del calendario, sveglie o avvisi quando l'app non è più in esecuzione. Queste app possono richiedere l'autorizzazione normale
USE_EXACT_ALARM
. L'autorizzazione USE_EXACT_ALARM
verrà concessa
al momento dell'installazione e le app che dispongono di questa autorizzazione potranno pianificare
sveglie esatte proprio come per le app con l'autorizzazione SCHEDULE_EXACT_ALARM
.
Casi d'uso che potrebbero non richiedere sveglie esatte
Poiché l'autorizzazione SCHEDULE_EXACT_ALARM
ora è negata per impostazione predefinita e la procedura di concessione delle autorizzazioni richiede passaggi aggiuntivi da parte degli utenti, gli sviluppatori sono vivamente invitati a valutare i loro casi d'uso e determinare se gli allarmi esatti sono ancora pertinenti per i loro casi d'uso.
Il seguente elenco mostra i flussi di lavoro comuni che potrebbero non richiedere un allarme esatto:
- Pianificare le attività ripetute durante il ciclo di vita dell'app
- Il metodo
set()
è utile se l'attività deve tenere a mente i vincoli in tempo reale, ad esempio l'attivazione alle 14:00 di domani o tra 30 minuti. In caso contrario, ti consigliamo di utilizzare i metodipostAtTime()
opostDelayed()
. - Operazioni in background pianificate, ad esempio l'aggiornamento dell'app e il caricamento dei log
WorkManager
consente di pianificare lavori periodici sensibili alle tempistiche. Puoi fornire un intervallo di ripetizione e un intervallo flexInterval (minimo 15 minuti) per definire un runtime granulare per il lavoro.- È necessaria l'attivazione della sveglia a un'ora approssimativa mentre il sistema è in stato inattivo
- Usa una sveglia inesatta. In particolare, chiama
setAndAllowWhileIdle()
. - Azione specificata dall'utente che deve verificarsi dopo un intervallo di tempo specifico
- Usa una sveglia inesatta. In particolare, chiama
set()
. - Azione specificata dall'utente che può verificarsi in un intervallo di tempo
- Usa una sveglia inesatta. In particolare, chiama
setWindow()
. Tieni presente che la durata minima consentita per la finestra è 10 minuti.
Passaggi di migrazione per continuare a utilizzare le sveglie esatte
Come minimo, le app devono verificare se dispongono dell'autorizzazione prima di programmare sveglie esatte. Se le app non dispongono dell'autorizzazione, devono richiederla all'utente richiamando un intent.
Si tratta dello stesso flusso di lavoro standard per la richiesta di un'autorizzazione speciale:
- Le app devono chiamare
AlarmManager.canScheduleExactAlarms()
per verificare che disponga dell'autorizzazione appropriata. Se l'app non dispone dell'autorizzazione, richiama un intent che include
ACTION_REQUEST_SCHEDULE_EXACT_ALARM
e il nome del pacchetto dell'app per chiedere agli utenti di concedere l'autorizzazione.Controlla la decisione dell'utente nel metodo
onResume()
della tua app.Ascolta le trasmissioni di
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
che vengono inviate se l'utente concede l'autorizzazione.Se l'utente ha concesso l'autorizzazione alla tua app, la tua app può impostare sveglie esatte. Se l'utente ha invece negato l'autorizzazione, riduci automaticamente la tua esperienza nell'app in modo che fornisca funzionalità all'utente senza le informazioni protette da tale autorizzazione.
Il seguente snippet di codice mostra come verificare l'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 automaticamente la rimozione in caso di rifiuto delle autorizzazioni
Alcuni utenti si rifiuteranno di concedere l'autorizzazione. In questo scenario, consigliamo delle app per ridurre in modo controllato l'esperienza e cercare di offrire comunque la migliore esperienza utente di riserva identificando i relativi casi d'uso.
Esenzioni
I seguenti tipi di app sono sempre autorizzati a chiamare i metodi setExact()
o
setExactAndAllowWhileIdle()
:
- App firmate con il certificato della piattaforma.
- App con privilegi.
- App che si trovano nella lista consentita delle app avanzate (se la tua app soddisfa i requisiti, puoi richiederla utilizzando l'azione dell'intent
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
).
Pre-concessioni
- Ai proprietari del ruolo di
SYSTEM_WELLBEING
verrà concesso in anticipoSCHEDULE_EXACT_ALARM
.
Linee guida per i test
Per testare questa modifica, disattiva l'autorizzazione Sveglie e 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 della tua app.