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
programmare 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 dell'app a un dispositivo con Android 14 tramite un
operazione di backup e ripristino, l'autorizzazione continuerà a essere negata. Se
app esistente dispone già di questa autorizzazione, verrà pre-concessa quando il dispositivo
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
sono ancora
applicabili, tra cui:
- Verifica l'autorizzazione con
canScheduleExactAlarms()
prima della pianificazione 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, svegliarsi
allarmi 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
consente di pianificare il lavoro periodico sensibile al tempo. È possibile fornire un intervallo di ripetizione e un intervallo flexInterval (15 minuti minimo) per puoi definire runtime granulare per il lavoro.- È necessaria una sveglia che suoni all'ora approssimativa mentre il sistema è in stato di inattività
- Usa una sveglia inesatta. In particolare, chiama
setAndAllowWhileIdle()
. - Azione specificata dall'utente che deve avvenire dopo un intervallo di tempo specifico
- Usa una sveglia inesatta. In particolare, chiama
set()
. - Azione specificata dall'utente che può avvenire entro un periodo 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 se hanno l'autorizzazione prima programmazione di sveglie esatte. Se le app non hanno l'autorizzazione, devono richiederla dall'utente richiamando un intent.
È uguale al flusso di lavoro standard per richiedere un'offerta speciale autorizzazione:
- Le app devono chiamare il numero
AlarmManager.canScheduleExactAlarms()
per confermare che disponga dell'autorizzazione appropriata. Se l'app non dispone dell'autorizzazione, richiama un intent che includa la classe
ACTION_REQUEST_SCHEDULE_EXACT_ALARM
, insieme al pacchetto dell'app per chiedere agli utenti di concedere l'autorizzazione.Controlla la decisione dell'utente nel metodo
onResume()
della tua dell'app.Tieni d'occhio l'evento
AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
annunci che vengono inviati 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, riduci in modo gentile la tua esperienza nell'app in modo che fornisca funzionalità l'utente senza le informazioni protette da tale 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, ti consigliamo app per ridurre elegantemente l'esperienza e cercare comunque di fornire il miglior una possibile esperienza utente di riserva identificando i 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 concessi in anticipoSCHEDULE_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.