Modifiche al comportamento: tutte le app

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. Dovresti testare l'app e poi modificarla come necessario per supportarle correttamente, ove applicabile.

Assicurati di esaminare anche l'elenco delle modifiche del comportamento che interessano solo le app con target Android 13.

Prestazioni e batteria

Task Manager

Nella parte inferiore del riquadro delle notifiche è presente un pulsante che indica il numero di app attualmente in esecuzione in background. Quando premi questo pulsante, viene visualizzata una finestra di dialogo con i nomi di diverse app. Il pulsante Interrompi si trova a destra di ogni app.
Figura 1. Flusso di lavoro per Task Manager , che consente agli utenti di interrompere le app con servizi in primo piano in esecuzione. Questo flusso di lavoro viene visualizzato solo sui dispositivi con Android 13 o versioni successive.

A partire da Android 13 (livello API 33), gli utenti possono completare un flusso di lavoro dalla schermata Riquadro delle notifiche per interrompere le app con servizi in primo piano in esecuzione, come mostrato nella figura 1. Questa funzionalità è nota come Task Manager. Le app devono essere in grado di gestire questa interruzione avviata dall'utente.

Migliorare la gestione dei job di prefetch utilizzando JobScheduler

JobScheduler consente alle app di contrassegnare job specifici come job di "prefetch" (utilizzando JobInfo.Builder.setPrefetch()), il che significa che idealmente dovrebbero essere eseguiti in prossimità e prima del successivo lancio dell'app per migliorare l'esperienza utente. In passato, JobScheduler utilizzava l'indicatore solo per consentire ai job di prefetch di utilizzare opportunisticamente 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 verrà lanciata un'app e utilizza questa stima per eseguire i job di pre-caricamento. Le app devono provare a utilizzare i job di prefetch per qualsiasi attività che vogliono che venga eseguita prima del successivo lancio dell'app.

Utilizzo delle risorse della batteria

Android 13 (livello API 33) offre al sistema i seguenti modi per gestire meglio la durata della batteria del dispositivo:

Mentre testi l'app con queste modifiche, assicurati di controllare quanto segue:

  • Testa la risposta dell'app quando il sistema la inserisce nel bucket di standby "con restrizioni" per le app. Utilizza il seguente comando Android Debug Bridge (ADB) per assegnare l'app a questo bucket:

    adb shell am set-standby-bucket PACKAGE_NAME restricted
    
  • Verifica come la tua app risponde alle seguenti limitazioni che in genere si applicano alle app in uno stato "con restrizioni" 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 si attivano
    • I job non vengono eseguiti

    Utilizza il seguente comando ADB per impostare la tua app in questo stato "con restrizioni":

    adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND ignore
    

Quote di Firebase Cloud Messaging (FCM) con priorità elevata

Android 13 (livello API 33) aggiorna le quote di Firebase Cloud Messaging (FCM) per migliorare l'affidabilità della consegna di FCM ad alta priorità per le app che mostrano notifiche in risposta a FCM ad alta priorità. In Android 13 (livello API 33) sono cambiate le seguenti funzionalità:

  • I bucket di app in standby non determinano più il numero di FCM ad alta priorità che un'app può utilizzare.
  • Le quote FCM ad alta priorità variano in proporzione al numero di notifiche mostrate all'utente in risposta ai messaggi FCM ad alta priorità.

Come nelle versioni precedenti di Android, i messaggi FCM con priorità elevata che superano la quota vengono retrocessi a priorità normale. Quando avvii i servizi in primo piano (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 ForegroundServiceStartNotAllowedException eccezioni.

Se la tua applicazione non pubblica sempre notifiche in risposta ai messaggi FCM di alta priorità, ti consigliamo di impostare la priorità di questi messaggi su normale in modo che i messaggi che generano una notifica non vengano sottoposti a downgrade.

Privacy

Autorizzazione di runtime per le notifiche

Android 13 (livello API 33) introduce una 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 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, nella clipboard, 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.

Anteprima del testo copiato senza segnalare contenuti sensibili
Anteprima del testo copiata senza segnalare contenuti sensibili.
Anteprima del testo copiato che segnala contenuti sensibili.
Anteprima del testo copiato che segnala contenuti sensibili.

Per segnalare contenuti sensibili, aggiungi un valore booleano aggiuntivo a ClipDescription. Tutte le app dovrebbero farlo, indipendentemente dal livello API target.


// 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 della clipboard, visita la pagina della funzionalità Copia e incolla.

Sicurezza

Eseguire la migrazione dall'ID utente condiviso

Se la tua app utilizza l'attributo ritirato android:sharedUserId 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 appena installata su dispositivi con Android 13 o versioni successive, si comporta come se non avessi mai definito android:sharedUserId. Le app aggiornate continuano a utilizzare l'ID utente condiviso esistente.

Gli ID utente condivisi causano un comportamento non deterministico all'interno del gestore dei pacchetti. L'app deve invece utilizzare meccanismi di comunicazione appropriati, come servizi e fornitori di contenuti, 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 precedente dell'implementazione del servizio vocale rimossa

Android 13 rimuove l'implementazione di SpeechService, tra cui il metodo di inserimento vocale, RecognitionService e un'API basata sugli intent, dall'app Google.

In Android 12 sono state apportate le seguenti modifiche:

  • È stata eseguita la migrazione delle funzionalità di SpeechService all'app Servizi vocali di Google, che è diventato il fornitore di SpeechService 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 reindirizzare il traffico all'app Speech Services by Google. In Android 13, questo trampolino viene rimosso.

Le app devono utilizzare il fornitore predefinito del dispositivo per SpeechService, anziché codificare in modo rigido un'app specifica.