La piattaforma Android 13 include modifiche al comportamento che potrebbero influire sulla tua app. Le
seguenti modifiche al comportamento si applicano a tutte le app quando vengono eseguite su Android 13,
indipendentemente da targetSdkVersion
. Devi testare la tua app e poi modificarla in base alle
necessità per supportare correttamente queste funzionalità, ove applicabile.
Assicurati di esaminare anche l'elenco delle modifiche al comportamento che interessano solo le app che hanno come target Android 13.
Prestazioni e batteria
Task Manager
A partire da Android 13 (livello API 33), gli utenti possono completare un flusso di lavoro dal riquadro delle notifiche per arrestare le app con servizi in primo piano in corso, come mostrato nella figura 1. Questa funzionalità è nota come Task Manager. Le app devono essere in grado di gestire questo arresto avviato dall'utente.
Migliorare la gestione dei job di precaricamento utilizzando JobScheduler
JobScheduler offre alle app un modo per contrassegnare determinati job come job di "precaricamento" (utilizzando JobInfo.Builder.setPrefetch()
), il che significa che idealmente dovrebbero essere eseguiti in prossimità e prima del successivo avvio dell'app per migliorare l'esperienza utente.
In passato, JobScheduler ha utilizzato il segnale solo per consentire ai job di prefetch di utilizzare in modo opportunistico i dati senza costi o in eccesso.
In Android 13 (livello API 33) e versioni successive, il sistema tenta di determinare la prossima volta che un'app verrà avviata e utilizza questa stima per eseguire i job di precaricamento. Le app devono tentare di utilizzare i job di precaricamento per qualsiasi operazione che vogliono che venga eseguita prima del successivo avvio dell'app.
Utilizzo delle risorse della batteria
Android 13 (livello API 33) offre i seguenti modi per consentire al sistema di gestire meglio la durata della batteria del dispositivo:
- Regole aggiornate su quando il sistema inserisce la tua app nel bucket di standby delle app"con limitazioni".
- Nuove limitazioni al lavoro che la tua app può svolgere quando l'utente la imposta sullo stato "con limitazioni" per l'utilizzo della batteria in background.
Mentre testi l'app con queste modifiche, assicurati di controllare quanto segue:
Testa la risposta della tua app quando il sistema la inserisce nel bucket di standby delle app"con limitazioni". Utilizza il seguente comando Android Debug Bridge (ADB) per assegnare la tua app a questo bucket:
adb shell am set-standby-bucket PACKAGE_NAME restricted
Verifica in che modo la tua app risponde alle seguenti limitazioni che si applicano comunemente alle app che si trovano in uno stato "con limitazioni" per l'utilizzo della batteria in background:
- Impossibile avviare i servizi in primo piano
- I servizi in primo piano esistenti vengono rimossi dal primo piano
- Le sveglie non vengono attivate
- I job non vengono eseguiti
Utilizza il seguente comando ADB per impostare l'app in questo stato "con limitazioni":
adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND ignore
Quote per i messaggi Firebase Cloud Messaging (FCM) ad alta priorità
Gli aggiornamenti di Android 13 (livello API 33) Firebase Cloud Messaging (FCM) migliorano l'affidabilità della distribuzione FCM ad alta priorità per le app che mostrano notifiche in risposta a FCM ad alta priorità. In Android 13 (livello API 33) sono state apportate le seguenti modifiche:
- I bucket di standby delle app non determinano più il numero di FCM ad alta priorità che un'app può utilizzare.
- Il sistema ora esegue il downgrade dei messaggi con priorità elevata se rileva un'app che invia costantemente messaggi con priorità elevata che non generano una notifica.
Come nelle versioni precedenti di Android, i messaggi FCM ad alta priorità che superano la quota vengono declassati a priorità normale. Quando avvii Foreground Services (FGS) in risposta a un messaggio FCM, ti consigliamo di controllare il risultato di RemoteMessage.getPriority()
e di verificare che sia PRIORITY_HIGH
e/o di gestire eventuali eccezioni ForegroundServiceStartNotAllowedException
.
Se la tua applicazione non pubblica sempre notifiche in risposta a FCM di priorità elevata, ti consigliamo di modificare la priorità di queste FCM impostandola su normale in modo che i messaggi che generano una notifica non vengano declassati.
Privacy
Autorizzazione di runtime per le notifiche
Android 13 (livello API 33) introduce un'autorizzazione di notifica di runtime:
POST_NOTIFICATIONS
.
Questa modifica aiuta gli utenti a concentrarsi sulle notifiche più importanti per loro.
Ti consigliamo vivamente di scegliere come target Android 13 o versioni successive il prima possibile per usufruire degli effetti del controllo e della flessibilità aggiuntivi di questa funzionalità.
Scopri di più sulle best practice per le autorizzazioni app.
Nascondere i contenuti sensibili dagli appunti
Se la tua app consente agli utenti di copiare contenuti sensibili, come password o dati della carta di credito, negli appunti, devi aggiungere un flag a ClipDescription
di ClipData prima di chiamare ClipboardManager#setPrimaryClip()
. L'aggiunta
di questo flag impedisce la visualizzazione di contenuti sensibili nell'anteprima dei contenuti.


Per segnalare contenuti sensibili, aggiungi un extra booleano a ClipDescription
. Tutte
le app devono farlo, indipendentemente dal livello API di destinazione.
// When your app is compiled with the API level 33 SDK or higher
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
}
}
// If your app is compiled with a lower SDK
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean("android.content.extra.IS_SENSITIVE", true)
}
}
Per scoprire di più sulla nuova UI degli appunti, visita la pagina della funzionalità Copia e incolla.
Sicurezza
Eseguire la migrazione dall'ID utente condiviso
Se la tua app utilizza l'attributo
android:sharedUserId
deprecato
e non dipende più dalla funzionalità dell'attributo, puoi impostare l'attributo
android:sharedUserMaxSdkVersion
su 32
, come mostrato nello snippet di codice seguente:
<manifest ...> <!-- To maintain backward compatibility, continue to use "android:sharedUserId" if you already added it to your manifest. --> android:sharedUserId="SHARED_PACKAGE_NAME" android:sharedUserMaxSdkVersion="32" ... </manifest>
Questo attributo indica al sistema che la tua app non si basa più su un ID utente condiviso. Se la tua app dichiara android:sharedUserMaxSdkVersion
ed è stata installata di recente su dispositivi con Android 13 o versioni successive, si comporta come se non avessi mai definito android:sharedUserId
. Le app aggiornate utilizzano ancora
l'ID utente condiviso esistente.
Gli ID utente condivisi causano un comportamento non deterministico all'interno del gestore di pacchetti. La tua app deve invece utilizzare meccanismi di comunicazione appropriati, come servizi e content provider, per facilitare l'interoperabilità tra i componenti condivisi.
Esperienza utente
Notifiche dei servizi in primo piano ignorabili
Sui dispositivi con Android 13 o versioni successive, gli utenti possono ignorare le notifiche associate ai servizi in primo piano per impostazione predefinita.
Funzionalità di base
Copia legacy dell'implementazione del servizio vocale rimossa
Android 13 rimuove l'implementazione di SpeechService
, inclusi
Voice IME, RecognitionService
e un'API basata su intent
dall'app Google.
In Android 12 sono state apportate le seguenti modifiche:
- Le funzionalità di
SpeechService
sono state migrate all'app Servizi vocali di Google, che è diventata il providerSpeechService
predefinito. - La funzionalità
RecognitionService
è stata spostata nell'app Android System Intelligence per supportare il riconoscimento vocale sul dispositivo.
Per contribuire a mantenere la compatibilità delle app su Android 12, l'app Google utilizza un trampolino per deviare il traffico verso l'app Servizi vocali di Google. In Android 13, questo trampolino viene rimosso.
Le app devono utilizzare il provider predefinito del dispositivo per SpeechService
, anziché
codificare in modo permanente un'app specifica.