Aggiunta del supporto per il gesto Indietro predittivo

Figura 1. Mockup dell'aspetto e del funzionamento del gesto Indietro predittivo su uno smartphone

Indietro predittivo, una funzionalità di navigazione tramite gesti, consente agli utenti di visualizzare in anteprima la destinazione dello scorrimento indietro.

Ad esempio, l'utilizzo di un gesto Indietro può mostrare un'anteprima animata della schermata Home dietro l'app, come mostrato nel mockup nella Figura 1.

A partire da Android 15, l'opzione sviluppatore per le animazioni di indietro predittive non è più disponibile. Le animazioni di sistema, come il ritorno alla home page, il passaggio da un'attività all'altra e il passaggio da un'attività all'altra, ora vengono visualizzate per le app che hanno attivato il gesto Indietro predittivo interamente o a livello di attività.

Puoi testare questa animazione di ritorno alla home page (come descritto in una sezione successiva di questa pagina).

Il supporto del gesto Indietro predittivo richiede l'aggiornamento dell'app, l'utilizzo di OnBackPressedCallback compatibile con le versioni precedenti in AndroidX Activity 1.6.0 o API successive oppure l'utilizzo della nuova API della piattaforma OnBackInvokedCallback. La maggior parte delle app utilizza l'API AndroidX compatibile con le versioni precedenti.

Questo aggiornamento fornisce un percorso di migrazione per intercettare correttamente la navigazione a ritroso, che prevede la sostituzione delle intercettazioni indietro da KeyEvent.KEYCODE_BACK e di qualsiasi classe con metodi onBackPressed come Activity e Dialog con le nuove API Back di sistema.

Codelab e video di Google I/O

Oltre a utilizzare la documentazione in questa pagina, prova il nostro codelab. Fornisce un'implementazione di un caso d'uso comune di una WebView che gestisce il gesto Indietro predittivo utilizzando le API AndroidX Activity.

Puoi anche guardare il nostro video di Google I/O, che illustra altri esempi di implementazione delle API AndroidX e della piattaforma.

Gestire i gesti Indietro personalizzati in Scrivi

Compose fornisce il composable PredictiveBackHandler per gestire i gesti di indietro personalizzati. Questa API ti consente di rispondere al gesto Indietro e fornisce un Flow di oggetti BackEventCompat che puoi utilizzare per implementare animazioni o transizioni personalizzate mentre l'utente scorre.

Per utilizzare PredictiveBackHandler, assicurati che la tua app includa la dipendenza androidx.activity:activity-compose (versione 1.8.0 o successive):

// In your build.gradle.kts file:
dependencies {
    implementation("androidx.activity:activity-compose:1.8.0")
}

PredictiveBackHandler(enabled = isBackHandlerEnabled) { progress: Flow<BackEventCompat> ->
    try {
        progress.collect { backEvent ->
            // Update your UI or animation based on backEvent.progress.
        }
        // Handle the final back action (e.g., navigate back).
    } catch (e: CancellationException) {
        // Back gesture was cancelled, reset your UI.
    }
}

Se devi solo intercettare il gesto Indietro senza monitorare l'avanzamento, utilizza BackHandler.

Aggiornare un'app che utilizza la navigazione a ritroso predefinita

Indietro predittivo è attivo per impostazione predefinita.

Se la tua app utilizza Fragment o il componente di navigazione, esegui l'upgrade anche ad AndroidX Activity 1.6.0 o versioni successive.

Aggiornare un'app che utilizza la navigazione a ritroso personalizzata

Se la tua app implementa un comportamento di ritorno personalizzato, esistono percorsi di migrazione diversi a seconda che utilizzi AndroidX e di come gestisce la navigazione a ritroso.

Come la tua app gestisce la navigazione a ritroso Percorso di migrazione consigliato (link in questa pagina)
API AndroidX Eseguire la migrazione di un'implementazione del pulsante Indietro AndroidX esistente
API della piattaforma non supportate Eseguire la migrazione di un'app AndroidX contenente API di navigazione a ritroso non supportate alle API AndroidX

Eseguire la migrazione di un'implementazione della navigazione a ritroso di AndroidX

Questo caso d'uso è il più comune (e il più consigliato). Si applica alle app nuove o esistenti che implementano la gestione della navigazione tramite gesti personalizzata con OnBackPressedDispatcher, come descritto in Fornire la navigazione a ritroso personalizzata.

Per assicurarti che le API che utilizzano già OnBackPressedDispatcher (come i Fragment e il componente di navigazione) funzionino perfettamente con il gesto Indietro predittivo, esegui l'upgrade ad AndroidX Activity 1.6.0 o versioni successive.

// In your build.gradle file:
dependencies {
    // Add this in addition to your other dependencies
    implementation "androidx.activity:activity:1.6.0"
}

Esegui la migrazione di un'app AndroidX contenente API di navigazione a ritroso non supportate alle API AndroidX

Se la tua app utilizza le librerie AndroidX, ma implementa o fa riferimento alle API di navigazione a ritroso non supportate, dovrai eseguire la migrazione all'utilizzo delle API AndroidX per supportare il nuovo comportamento.

Per eseguire la migrazione delle API non supportate alle API AndroidX:

  1. Esegui la migrazione della logica di gestione del pulsante Indietro del sistema ad AndroidX OnBackPressedDispatcher con un'implementazione di OnBackPressedCallback. Per indicazioni dettagliate, vedi Fornire la navigazione a ritroso personalizzata.

  2. Disattiva OnBackPressedCallback quando vuoi interrompere l'intercettazione del gesto Indietro.

  3. Interrompi l'intercettazione degli eventi Indietro utilizzando OnBackPressed o KeyEvent.KEYCODE_BACK.

  4. Assicurati di eseguire l'upgrade ad AndroidX Activity 1.6.0 o versioni successive.

    // In your build.gradle file:
    dependencies {
        // Add this in addition to your other dependencies
        implementation "androidx.activity:activity:1.6.0"
    }
    

Disattivare Indietro predittivo

Per disattivare la funzionalità, in AndroidManifest.xml, nel tag <application>, imposta il flag android:enableOnBackInvokedCallback su false.

<application
    ...
    android:enableOnBackInvokedCallback="false"
    ... >
...
</application>

Se lo imposti su false, succede quanto segue:

  • Disattiva l'animazione di sistema per il gesto Indietro predittivo.
  • Ignora OnBackInvokedCallback, ma le chiamate OnBackPressedCallback continuano a funzionare.

Disattivazione a livello di attività

Il flag android:enableOnBackInvokedCallback consente di disattivare le animazioni di sistema predittive a livello di attività. Questo comportamento rende più gestibile la migrazione di app di grandi dimensioni con più attività ai gesti Indietro predittivi.

Il seguente codice mostra un esempio di enableOnBackInvokedCallback impostato per attivare l'animazione di sistema di ritorno alla home page da MainActivity:

<manifest ...>
    <application . . .

        android:enableOnBackInvokedCallback="false">

        <activity
            android:name=".MainActivity"
            android:enableOnBackInvokedCallback="true"
            ...
        </activity>
        <activity
            android:name=".SecondActivity"
            android:enableOnBackInvokedCallback="false"
            ...
        </activity>
    </application>
</manifest>

Tieni presente quanto segue quando utilizzi il flag android:enableOnBackInvokedCallback:

  • L'impostazione android:enableOnBackInvokedCallback=false disattiva le animazioni di ritorno predittivo a livello di attività o di app, a seconda di dove imposti il tag, e indica al sistema di ignorare le chiamate all'API della piattaforma OnBackInvokedCallback. Tuttavia, le chiamate a OnBackPressedCallback continuano a essere eseguite perché OnBackPressedCallback è compatibile con le versioni precedenti e chiama l'API onBackPressed, che non è supportata prima di Android 13.
  • L'impostazione del flag enableOnBackInvokedCallback a livello di app stabilisce il valore predefinito per tutte le attività nell'app. Puoi sostituire il valore predefinito per attività impostando il flag a livello di attività, come mostrato nell'esempio di codice precedente.

Linee guida per il callback

Segui queste linee guida quando utilizzi i callback del sistema supportati per il pulsante Indietro: PredictiveBackHandler o BackHandler (per Compose), OnBackPressedCallback o OnBackInvokedCallback.

Determina lo stato dell'interfaccia utente che attiva e disattiva ogni callback

Stato UI è una proprietà che descrive la UI. Ti consigliamo di seguire questi passaggi di alto livello.

  1. Determina lo stato dell'interfaccia utente che attiva e disattiva ogni callback.

  2. Definisci questo stato utilizzando un tipo di contenitore di dati osservabile, ad esempio StateFlow o Compose State, e attiva o disattiva il callback al variare dello stato.

Se in precedenza la tua app associava la logica di ritorno a istruzioni condizionali, ciò potrebbe significare che stai reagendo all'evento Indietro dopo che si è già verificato. Evita questo pattern con i callback più recenti. Se possibile, sposta il callback al di fuori dell'istruzione condizionale e associa il callback a un tipo di contenitore di dati osservabile.

Utilizzare i callback di sistema per la logica dell'interfaccia utente

La logica dell'interfaccia utente determina come visualizzare l'interfaccia utente. Utilizza i callback di indietro del sistema per eseguire la logica dell'interfaccia utente, ad esempio visualizzare una finestra di dialogo o eseguire un'animazione.

Se la tua app attiva un OnBackPressedCallback o un OnBackInvokedCallback con PRIORITY_DEFAULT o PRIORITY_OVERLAY, le animazioni di indietro predittivo non vengono eseguite e devi gestire l'evento Indietro. Non creare questi callback per eseguire la logica di business o per la registrazione.

Utilizza i seguenti approcci se la tua app deve eseguire la logica di business o registrare quando l'utente scorre indietro:

  • In Compose: log all'interno del callback onCleared() di un ViewModel associato alla destinazione Compose. Questo è il segnale migliore per sapere quando una destinazione Compose viene rimossa dallo stack precedente e distrutta.
  • Su Android 16 e versioni successive: utilizza OnBackInvokedCallback con PRIORITY_SYSTEM_NAVIGATION_OBSERVER. In questo modo viene creata una richiamata dell'observer che non utilizza l'evento indietro. Ad esempio, puoi registrare questo callback quando l'utente scorre indietro dall'attività principale (uscendo dalla tua app) per registrare l'evento Indietro o eseguire la logica di business, consentendo comunque la riproduzione dell'animazione di ritorno alla home page.
  • Nelle app basate su View: registra all'interno dei callback del ciclo di vita o dello stack precedente anziché utilizzare gli eventi indietro:
    • Per le transizioni di attività, controlla se isFinishing è true entro Activity.onDestroy().
    • Per le transizioni dei fragment, controlla se isRemoving è true all'interno del ciclo di vita della visualizzazione del fragment onDestroy() o utilizza FragmentManager.OnBackStackChangedListener (onBackStackChangeStarted / onBackStackChangeCommitted).

Crea callback a responsabilità singola

Puoi aggiungere più callback al dispatcher. I callback vengono aggiunti a uno stack in cui l'ultimo callback abilitato aggiunto gestisce il successivo gesto Indietro con un callback per gesto Indietro.

È più facile gestire lo stato di attivazione di un callback se questo ha una singola responsabilità. Ad esempio:

Ordine dei callback in uno stack in Compose.
Figura 2. Diagramma dello stack di callback in Compose.

La figura 2 mostra come puoi avere più callback nello stack, ognuno responsabile di una cosa. In Compose, i callback vengono valutati dal componente componibile più interno a quello più esterno e un callback viene eseguito solo se i callback che lo precedono nello stack sono disattivati:

  • Il messaggio "Confermi di voler…" PredictiveBackHandler è abilitato quando l'utente inserisce dati in un modulo e disattivato in caso contrario. Se attivata, intercetta il gesto Indietro per visualizzare una finestra di dialogo di conferma o un'animazione in-app personalizzata.
  • Il BackHandler a livello di schermo viene eseguito se il callback precedente è disattivato. In questo esempio, è disabilitato.
  • Il callback NavHost gestisce la navigazione a ritroso per estrarre le destinazioni dal back stack se i callback personalizzati precedenti sono disattivati.
  • Infine, il sistema gestisce il gesto Indietro se tutti i callback precedenti sono disattivati. Quando lo stack indietro si trova nella destinazione principale, il sistema attiva animazioni a livello di sistema come il ritorno alla home page, il passaggio da un'attività all'altra e il passaggio da un'app all'altra.

Lo stesso comportamento dello stack si applica nelle app basate su View: l'ultima aggiunta abilitata OnBackPressedCallback ha la precedenza, con fallback a FragmentManager e infine alla gestione del pulsante Indietro del sistema.

Testare l'animazione del gesto Indietro predittivo

A partire da Android 15, le animazioni di sistema come il ritorno alla home page, il passaggio da un'attività all'altra e il passaggio da un'app all'altra sono attive per impostazione predefinita per le app che supportano la navigazione Indietro predittiva. Non sono più nascoste dietro un'opzione sviluppatore.

Sui dispositivi con Android 13 o Android 14, puoi attivare l'opzione sviluppatore per testare l'animazione di ritorno alla schermata Home mostrata nella figura 1:

  1. Sul dispositivo, vai a Impostazioni > Sistema > Opzioni sviluppatore.

  2. Seleziona Animazioni Indietro predittivo.

  3. Avvia l'app aggiornata e usa il gesto Indietro per vederla in azione.