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 della tua app all'API SplashScreen per contribuire a garantire che venga visualizzata correttamente in Android 12 e versioni successive.

A partire da Android 12, il sistema applica la schermata iniziale predefinita del sistema Android agli avvii a freddo e a caldo per tutte le app. Per impostazione predefinita, questa schermata iniziale di sistema è stata creata utilizzando l'elemento icona in Avvio applicazioni della tua app e i windowBackground dei tuoi tema, se è di un solo colore.

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

  • Se la tua schermata iniziale esistente è implementata utilizzando una tema personalizzato che sostituisce android:windowBackground, il sistema sostituisce la tua schermata iniziale personalizzata con un sistema Android predefinito schermata iniziale su Android 12 e versioni successive. Questa potrebbe non essere l'esperienza prevista per la 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 di sistema followed by l'attività della schermata iniziale esistente.

Puoi evitare queste esperienze degradate o indesiderate completando la procedura di migrazione descritta 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 della piattaforma.

Raccolta di compatibilità di SplashScreen

Puoi usare direttamente l'API SplashScreen, ma ti consigliamo vivamente di utilizzare lo Raccolta di compatibilità SplashScreen di Androidx . La libreria compatibile utilizza l'API SplashScreen, consente compatibilità con le versioni precedenti e crea un aspetto e un design coerenti per la schermata iniziale vengono visualizzati in tutte le versioni di Android. Questo documento è 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 uguale a quella precedente la migrazione. A partire dal giorno La schermata iniziale di Android 12 ha lo stesso aspetto di Android 12.

Se esegui la migrazione utilizzando la libreria SplashScreen compat, il sistema mostra 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 della schermata iniziale esistente ad Android 12 e versioni successive.

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

Per eseguire la migrazione della schermata iniziale:

  1. Nel file build.gradle, modifica compileSdkVersion e includi la libreria SplashScreen compat 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 di Theme.SplashScreen. Imposta il valore di postSplashScreenTheme al tema che deve essere utilizzato da Activity e valore di windowSplashScreenAnimatedIcon a un elemento drawable o animato disegnabile. 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 quello 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 chiamaresuper.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 schermata iniziale, che puoi eventualmente utilizzare per personalizzare l'animazione o per mantenere la schermata iniziale sullo schermo per una durata più lunga. Per maggiori dettagli sulla personalizzazione dell'animazione, consulta Mantenere la schermata iniziale sullo schermo per periodi più lunghi e Personalizzare l'animazione per chiudere la schermata iniziale.

Adatta l'attività della schermata iniziale personalizzata alla schermata iniziale

Dopo aver eseguito la migrazione alla schermata iniziale per Android 12 e versioni successive, decidi cosa a che fare con la precedente schermata iniziale personalizzata Activity. Hai quanto segue opzioni:

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

Impedisci la visualizzazione dell'attività personalizzata

Se la schermata iniziale Activity precedente è utilizzata principalmente per i percorsi, valutano modi per rimuoverlo. Ad esempio, potresti creare un link diretto l'attività principale o passare a una singola attività con i sottocomponenti. Se non è possibile, puoi utilizzare SplashScreen.setKeepOnScreenCondition per mantenere l'attività di routing, ma interromperne il rendering. In questo modo, la schermata iniziale viene trasferita all'attività successiva e supporta 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 di sistema alla schermata iniziale personalizzataActivity personalizzando l'animazione per la chiusura della schermata iniziale. Tuttavia, se possibile, è meglio evitare questo scenario e utilizzare l'SplashScreen API per aggiungere il branding alla schermata iniziale.

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

Rimuovi l'Attività della schermata iniziale personalizzata

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

  • Utilizza il caricamento lento per i componenti, i moduli o le librerie. Evita di caricare o inizializzare componenti o librerie non necessari per il funzionamento dell'app al momento del lancio. Caricali in un secondo momento, quando l'app ne ha bisogno.

    Se la tua app ha davvero bisogno di un componente per funzionare correttamente, caricalo solo quando è necessario e non al momento del lancio, oppure usa un thread in background per caricarlo dopo l'avvio dell'app. Cerca di fare in modo che il tuo Application.onCreate() sia leggero possibile.

    Puoi anche utilizzare la libreria App Startup per inizializzare i componenti all'avvio dell'applicazione. In questo modo, assicurati di caricare comunque tutti i moduli richiesti per l'attività iniziale e di non introdurre arresti anomali quando i moduli caricati in modo lazy diventano disponibili.

  • Crea un segnaposto durante il caricamento locale di una piccola quantità di dati. Utilizza la consigliato l'approccio basato sui temi e trattengono il rendering finché l'app pronto. 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 i segnaposto. Per i caricamenti basati su rete con durate indeterminate, Chiudi la schermata iniziale e mostra i segnaposto per il caricamento asincrono. Prova ad applicare all'area dei contenuti animazioni sottili che riflettono di caricamento. Assicurati che la struttura dei contenuti caricati corrisponda alla struttura dello scheletro per favorire una transizione fluida durante il caricamento dei contenuti.

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

Figura 1. Vengono mostrati i segnaposto dell'interfaccia utente.