Eseguire la migrazione dell'implementazione della schermata iniziale ad Android 12 e versioni successive

Se implementi una schermata iniziale personalizzata in Android 11 o versioni precedenti, esegui la migrazione dell'app all'API SplashScreen per assicurarti che venga visualizzata correttamente in Android 12 e versioni successive.

A partire da Android 12, il sistema applica la schermata iniziale predefinita di sistema Android sugli avvii a freddo e tiepidi per tutte le app. Per impostazione predefinita, questa schermata iniziale del sistema viene creata utilizzando l'elemento icona in Avvio applicazioni dell'app e l'icona windowBackground del tema, se è di un solo colore.

Se non esegui la migrazione della tua app, l'esperienza di lancio dell'app su Android 12 e versioni successive potrebbe essere ridotta o avere risultati indesiderati.

  • Se la schermata iniziale esistente è implementata utilizzando un tema personalizzato che sostituisce android:windowBackground, il sistema sostituisce la schermata iniziale personalizzata con una schermata iniziale predefinita del sistema Android su Android 12 e versioni successive. Potrebbe non essere l'esperienza prevista dalla tua app.

  • Se la schermata iniziale esistente è implementata utilizzando un Activity dedicato, l'avvio dell'app su dispositivi con Android 12 o versioni successive comporta la visualizzazione di schermate iniziali duplicate: viene visualizzata la schermata iniziale del sistema, seguita dall'attività della schermata iniziale esistente.

Puoi evitare queste esperienze ridotte o indesiderate completando il processo di migrazione descritto in questo documento. Dopo la migrazione, l'API migliora i tempi di avvio, ti offre il controllo completo sull'esperienza della schermata iniziale e crea un'esperienza di lancio più coerente con le altre app sulla piattaforma.

Libreria compatibili con schermata schermata

Puoi utilizzare direttamente l'API SplashScreen, ma ti consigliamo vivamente di utilizzare invece la libreria degli compatibilità SplashScreen di Androidx. La libreria di compatibilità utilizza l'API SplashScreen, consente la compatibilità con le versioni precedenti e crea un aspetto coerente per la visualizzazione della schermata iniziale su tutte le versioni di Android. Questo documento è stato scritto utilizzando la libreria compat.

Se esegui la migrazione utilizzando direttamente l'API SplashScreen, su Android 11 e versioni precedenti la schermata iniziale sarà esattamente la stessa di prima della migrazione. A partire da Android 12, la schermata iniziale ha l'aspetto di Android 12.

Se esegui la migrazione utilizzando la libreria di compatibilità SplashScreen, il sistema mostrerà la stessa schermata iniziale su tutte le versioni di Android.

Eseguire la migrazione dell'implementazione della schermata iniziale

Completa i seguenti passaggi per eseguire la migrazione dell'implementazione esistente della schermata iniziale ad Android 12 e versioni successive.

Questa procedura si applica a qualsiasi tipo di implementazione da cui esegui la migrazione. Se stai eseguendo la migrazione da un Activity dedicato, segui le best practice descritte in questo documento per adattare la tua schermata iniziale personalizzata Activity. L'API SplashScreen riduce anche la latenza di avvio, introdotta con un'attività di schermata iniziale dedicata.

Per eseguire la migrazione della schermata iniziale, segui questi passaggi:

  1. Nel file build.gradle, modifica il tuo compileSdkVersion e includi la libreria di compatibilità SplashScreen nelle dipendenze.

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-beta02'
    }
    
  2. Crea un tema con un elemento principale Theme.SplashScreen. Imposta il valore di postSplashScreenTheme sul tema che deve essere utilizzato da Activity e il valore di windowSplashScreenAnimatedIcon su un disegno disegnabile o animato. Gli altri attributi sono facoltativi.

    <style name="Theme.App.Starting" parent="Theme.SplashScreen">
       <!-- Set the splash screen background, animated icon, and animation
       duration. -->
       <item name="windowSplashScreenBackground">@color/...</item>
    
       <!-- Use windowSplashScreenAnimatedIcon to add a drawable or an animated
            drawable. One of these is required. -->
       <item name="windowSplashScreenAnimatedIcon">@drawable/...</item>
       <!-- Required for animated icons. -->
       <item name="windowSplashScreenAnimationDuration">200</item>
    
       <!-- Set the theme of the Activity that directly follows your splash
       screen. This is required. -->
       <item name="postSplashScreenTheme">@style/Theme.App</item>
    </style>
    

    Se vuoi aggiungere un colore di sfondo sotto l'icona, puoi utilizzare il tema Theme.SplashScreen.IconBackground e impostare l'attributo windowSplashScreenIconBackground.

  3. Nel file manifest, sostituisci il tema dell'attività iniziale con il tema creato nel passaggio precedente.

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  4. Chiama installSplashScreen nell'attività iniziale prima di chiamare super.onCreate().

    Kotlin

    class MainActivity : Activity() {
    
       override fun onCreate(savedInstanceState: Bundle?) {
           // Handle the splash screen transition.
           val splashScreen = installSplashScreen()
    
           super.onCreate(savedInstanceState)
           setContentView(R.layout.main_activity)
    ...
    

    Java

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
             // Handle the splash screen transition.
             SplashScreen splashScreen = SplashScreen.installSplashScreen(this);
    
             super.onCreate(savedInstanceState);
             setContentView(R.layout.main_activity);
        }
    }
    

installSplashScreen restituisce l'oggetto della schermata iniziale, che puoi utilizzare facoltativamente per personalizzare l'animazione o per mantenere la schermata iniziale sullo schermo per più tempo. Per maggiori dettagli sulla personalizzazione dell'animazione, vedi Mantenere la schermata iniziale sullo schermo per periodi più lunghi e Personalizzare l'animazione per chiudere la schermata iniziale.

Adattare l'Attività della schermata iniziale personalizzata alla schermata iniziale

Dopo aver eseguito la migrazione alla schermata iniziale di Android 12 e versioni successive, decidi cosa fare con la schermata iniziale personalizzata precedente Activity. Hai a disposizione le seguenti opzioni:

  • Conservare l'attività personalizzata, ma impedirne la visualizzazione.
  • Conserva l'attività personalizzata per motivi di branding.
  • Rimuovi l'attività personalizzata e adatta la tua app in base alle esigenze.

Impedisci la visualizzazione dell'attività personalizzata

Se la schermata iniziale precedente Activity viene utilizzata principalmente per il routing, valuta modi per rimuoverla. Ad esempio, puoi collegarti direttamente all'attività effettiva o passare a un'attività singola con componenti secondari. Se ciò non è possibile, puoi utilizzare SplashScreen.setKeepOnScreenCondition per mantenere attiva l'attività di routing, ma interromperne il rendering. Questa operazione trasferisce la schermata iniziale all'attività successiva e consente una transizione fluida.

Kotlin

  class RoutingActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        val splashScreen = installSplashScreen()
        super.onCreate(savedInstanceState)

        // Keep the splash screen visible for this Activity.
        splashScreen.setKeepOnScreenCondition { true }
        startSomeNextActivity()
        finish()
     }
   ...
  

Java

  public class RoutingActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      SplashScreen splashScreen = SplashScreen.installSplashScreen(this);

       super.onCreate(savedInstanceState);

       // Keep the splash screen visible for this Activity.
       splashScreen.setKeepOnScreenCondition(() -> true );
       startSomeNextActivity();
       finish();
    }
  ...
  

Mantieni l'attività personalizzata per il branding

Se vuoi utilizzare una schermata iniziale precedente Activity per motivi di branding, puoi passare dalla schermata iniziale del sistema alla schermata iniziale personalizzata Activity personalizzando l'animazione per chiudere la schermata iniziale. Tuttavia, ti consigliamo di evitare questo scenario, se possibile, e di utilizzare l'API SplashScreen per definire il branding della schermata iniziale.

Se devi visualizzare una finestra di dialogo, ti consigliamo di visualizzarla sopra l'attività successiva della schermata iniziale personalizzata o sopra l'attività principale dopo la schermata iniziale del sistema.

Rimuovere l'Attività della schermata iniziale personalizzata

In genere, consigliamo di rimuovere del tutto la schermata iniziale personalizzata Activity per evitare la duplicazione delle schermate iniziali, per aumentare l'efficienza e ridurre i tempi di caricamento delle schermate iniziali. Esistono diverse tecniche che puoi utilizzare per evitare di mostrare attività ridondanti sulla schermata iniziale.

  • Utilizza il caricamento lento per componenti, moduli o librerie. Evita di caricare o inizializzare componenti o librerie che non sono necessari per il funzionamento dell'app al momento dell'avvio. Caricale in un secondo momento, quando l'app ne avrà bisogno.

    Se la tua app ha davvero bisogno di un componente per funzionare correttamente, caricalo solo quando è realmente necessario e non al momento dell'avvio oppure utilizza un thread in background per caricarlo dopo l'avvio dell'app. Cerca di mantenere il tuo Application.onCreate() il più leggero possibile.

    Puoi inoltre trarre vantaggio dall'utilizzo della libreria App Startup per inizializzare i componenti all'avvio dell'applicazione. Durante questa operazione, assicurati di caricare comunque tutti i moduli richiesti per l'attività iniziale e non introdurre jank in cui diventano disponibili i moduli con caricamento lento.

  • Crea un segnaposto durante il caricamento locale di una piccola quantità di dati. Utilizza l'approccio consigliato per la tematizzazione e trattieni il rendering finché l'app non è pronta. Per implementare una schermata iniziale compatibile con le versioni precedenti, segui i passaggi descritti in Mantenere la schermata iniziale sullo schermo per periodi più lunghi.

  • Mostra segnaposto. Per i caricamenti basati sulla rete con durate indeterminate, chiudi la schermata iniziale e mostra i segnaposto per il caricamento asincrono. Valuta la possibilità di applicare all'area dei contenuti delle piccole animazioni che riflettano lo stato di caricamento. Assicurati che la struttura dei contenuti caricati corrisponda al meglio alla struttura dello scheletro per consentire una transizione fluida quando i contenuti vengono caricati.

  • Usa la memorizzazione nella cache. Quando un utente apre la tua app per la prima volta, puoi mostrare gli indicatori di caricamento per alcuni elementi dell'interfaccia utente, come mostrato nella figura che segue. La prossima volta che l'utente torna nella tua app, puoi mostrare questi contenuti memorizzati nella cache mentre carichi contenuti più recenti.

Figura 1. Visualizzazione dei segnaposto UI.