Le sveglie esatte sono concepite per notifiche avviate dall'utente o azioni che devono avvenire in un momento preciso.
SCHEDULE_EXACT_ALARM
, l'autorizzazione introdotta in Android 12 per consentire alle app di pianificare sveglie esatte non è più concessa in anticipo alla maggior parte delle app appena installate che hanno come target Android 13 e versioni successive (l'autorizzazione sarà 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 ha già questa autorizzazione, questa verrà concessa in anticipo quando il dispositivo eseguirà l'upgrade ad Android 14.
È necessaria l'autorizzazione SCHEDULE_EXACT_ALARM
per avviare sveglie esatte
tramite le seguenti API, altrimenti verrà visualizzato un SecurityException
:
Le best practice esistenti per l'autorizzazione SCHEDULE_EXACT_ALARM
continuano a essere applicate, tra cui:
- Controlla l'autorizzazione con
canScheduleExactAlarms()
prima di programmare sveglie esatte. - 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-concessione.
- 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 programmare sveglie esatte proprio come per le app con autorizzazione SCHEDULE_EXACT_ALARM
.
Casi d'uso che potrebbero non richiedere sveglie esatte
Poiché ora l'autorizzazione SCHEDULE_EXACT_ALARM
è 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 per stabilire se gli allarmi esatti hanno ancora senso per i loro casi d'uso.
Il seguente elenco mostra i flussi di lavoro comuni che potrebbero non richiedere una sveglia esatta:
- Pianificazione di lavori ripetuti per l'intera durata dell'app
- Il metodo
set()
è utile se l'attività deve tenere presenti vincoli in tempo reale, ad esempio se si attiva alle 14:00 di domani o tra 30 minuti. In caso contrario, ti consigliamo di utilizzare i metodipostAtTime()
opostDelayed()
. - Operazioni programmate in background, 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 flexIntervalli (minimo 15 minuti) per definire un runtime granulare per il lavoro.- L'allarme deve suonare all'ora approssimativa mentre il sistema è in stato inattivo
- Usa una sveglia inesatta. In particolare, chiama il numero
setAndAllowWhileIdle()
. - Azione specificata dall'utente che deve verificarsi dopo un intervallo di tempo specifico
- Usa una sveglia inesatta. In particolare, chiama il numero
set()
. - Azione specificata dall'utente che può verificarsi in un determinato periodo di tempo
- Usa una sveglia inesatta. In particolare, chiama il numero
setWindow()
. Tieni presente che la durata minima consentita per una finestra è 10 minuti.
Passaggi di migrazione per continuare a utilizzare le sveglie esatte
Come minimo, le app devono verificare di disporre dell'autorizzazione prima di programmare sveglie esatte. Se le app non hanno l'autorizzazione, devono richiederla all'utente richiamando un intent.
Questo è lo stesso del 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
, 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 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, quest'ultima può impostare sveglie esatte. Se invece l'utente ha negato l'autorizzazione, riduci leggermente l'esperienza con l'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 delle autorizzazioni
Alcuni utenti si rifiutano di concedere l'autorizzazione. In questo scenario, consigliamo delle app per ridurre in modo controllato l'esperienza e continuare a cercare di fornire la migliore esperienza utente di riserva possibile 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 funzionalità avanzate (se la tua app soddisfa i requisiti, puoi richiederla utilizzando l'azione intent
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
).
Pre-concessioni
- Ai titolari 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.