Migrer l'implémentation de l'écran de démarrage vers Android 12 ou version ultérieure

Si vous implémentez un écran de démarrage personnalisé sous Android 11 ou version antérieure, migrez votre application vers l'SplashScreen API pour vous assurer qu'elle s'affiche correctement sous Android 12 et version ultérieure.

À partir d'Android 12, le système applique l'écran de démarrage par défaut du système Android auxdémarrages à froid et à chaud de toutes les applications. Par défaut, cet écran de démarrage du système est créé à l'aide de l'élément d'icône de lanceur de votre application et de l'élément windowBackground de votre thème, s'il s'agit d'une couleur unique.

Si vous ne migrez pas votre application, l'expérience de lancement de votre application sous Android 12 et version ultérieure peut être dégradée ou avoir des résultats inattendus.

  • Si votre écran de démarrage existant est implémenté à l'aide d'un thème personnalisé qui remplace android:windowBackground, le système remplace votre écran de démarrage personnalisé par un écran de démarrage par défaut du système Android sous Android 12 et version ultérieure. Il est possible que ce ne soit pas l'expérience souhaitée pour votre application.

  • Si votre écran de démarrage existant est implémenté à l'aide d'un Activity, le lancement de votre application sur des appareils exécutant Android 12 ou version ultérieure entraîne des écrans de démarrage en double : l'écran de démarrage du système s'affiche, suivi de votre activité d'écran de démarrage existante.

Vous pouvez éviter ces expériences dégradées ou inattendues en suivant la procédure de migration décrite dans ce document. Après la migration, l'API améliore le temps de démarrage, vous donne un contrôle total sur l'expérience de l'écran de démarrage et crée une expérience de lancement plus cohérente avec les autres applications de la plate-forme.

Bibliothèque de compatibilité SplashScreen

Vous pouvez utiliser l'API SplashScreen directement, mais nous vous recommandons vivement d'utiliser la bibliothèque de compatibilité SplashScreen d'AndroidX à la place. La bibliothèque de compatibilité utilise l'API SplashScreen, active la rétrocompatibilité et crée une apparence cohérente pour l'affichage de l'écran de démarrage sur toutes les versions d'Android. Ce document est rédigé à l'aide de la bibliothèque de compatibilité.

Si vous effectuez la migration à l'aide de l'API SplashScreen directement, votre écran de démarrage sous Android 11 et version antérieure sera exactement le même qu'avant la migration. À partir d'Android 12, l'écran de démarrage a l'apparence d'Android 12.

Si vous effectuez la migration à l'aide de la bibliothèque de compatibilité SplashScreen, le système affiche le même écran de démarrage sur toutes les versions d'Android.

Migrer l'implémentation de votre écran de démarrage

Pour migrer l'implémentation de votre écran de démarrage existant vers Android 12 et version ultérieure, procédez comme suit :

Cette procédure s'applique à tous les types d'implémentation à partir desquels vous effectuez la migration. Si vous effectuez la migration à partir d'une Activity dédiée, suivez les bonnes pratiques décrites dans ce document pour adapter votre écran de démarrage Activity personnalisé. L'API SplashScreen réduit également la latence de démarrage introduite avec une activité d'écran de démarrage dédiée.

Pour migrer votre écran de démarrage, procédez comme suit :

  1. Dans le fichier build.gradle, modifiez votre compileSdkVersion et incluez la bibliothèque de compatibilité SplashScreen dans les dépendances.

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-beta02'
    }
    
  2. Créez un thème avec un parent Theme.SplashScreen. Définissez la valeur de postSplashScreenTheme sur le thème que l'Activity doit utiliser et la valeur de windowSplashScreenAnimatedIcon sur un drawable standard ou un drawable animé. Les autres attributs sont facultatifs.

    <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>
    

    Si vous souhaitez ajouter une couleur d'arrière-plan sous votre icône, vous pouvez utiliser le thème Theme.SplashScreen.IconBackground et définir l'attribut windowSplashScreenIconBackground.

  3. Dans le fichier manifeste, remplacez le thème de l'activité de démarrage par le thème que vous avez créé à l'étape précédente.

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  4. Appelez installSplashScreen dans l'activité de démarrage avant d'appeler 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 renvoie l'objet d'écran de démarrage, que vous pouvez éventuellement utiliser pour personnaliser l'animation ou pour que l'écran de démarrage reste affiché plus longtemps. Pour en savoir plus sur la personnalisation de l'animation, consultez Conserver l'écran de démarrage à l'écran plus longtemps et Personnaliser l'animation pour fermer l'écran de démarrage.

Adapter votre activité d'écran de démarrage personnalisée à l'écran de démarrage

Après avoir migré vers l'écran de démarrage pour Android 12 et version ultérieure, décidez quoi faire de votre Activity d'écran de démarrage personnalisée précédente. Vous avez les options suivantes :

  • Conserver l'activité personnalisée, mais l'empêcher de s'afficher.
  • Conserver l'activité personnalisée pour des raisons de branding.
  • Supprimer l'activité personnalisée et adapter votre application si nécessaire.

Empêcher l'affichage de l'activité personnalisée

Si votre Activity d'écran de démarrage précédente est principalement utilisée pour le routage, envisagez de la supprimer. Par exemple, vous pouvez créer un lien direct vers l'activité réelle ou passer à une activité unique avec des sous-composants. Si cela n'est pas possible, vous pouvez utiliser SplashScreen.setKeepOnScreenCondition pour conserver l'activité de routage, mais l'empêcher de s'afficher. L'écran de démarrage est ainsi transféré à l'activité suivante, ce qui permet une transition fluide.

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();
    }
  ...
  

Conserver l'activité personnalisée pour le branding

Si vous souhaitez utiliser un écran de démarrage précédent Activity pour des raisons de branding, vous pouvez passer de l'écran de démarrage du système à votre écran de démarrage personnalisé Activity en personnalisant l'animation pour fermer l'écran de démarrage. Toutefois, il est préférable d'éviter ce scénario si possible et d'utiliser l'API SplashScreen pour personnaliser votre écran de démarrage.

Si vous devez afficher une boîte de dialogue, nous vous recommandons de l'afficher sur l'activité d'écran de démarrage personnalisée suivante ou sur l'activité principale après l'écran de démarrage du système.

Supprimer l'activité d'écran de démarrage personnalisée

En règle générale, nous vous recommandons de supprimer complètement votre Activity d'écran de démarrage personnalisée précédente pour éviter la duplication des écrans de démarrage, augmenter l'efficacité et réduire les temps de chargement de l'écran de démarrage. Vous pouvez utiliser différentes techniques pour éviter d'afficher des activités d'écran de démarrage redondantes.

  • Utilisez le chargement différé pour vos composants, modules ou bibliothèques. Évitez de charger ou d'initialiser des composants ou des bibliothèques qui ne sont pas nécessaires au fonctionnement de l'application au lancement. Chargez-les ultérieurement, lorsque l'application en a besoin.

    Si votre application a vraiment besoin d'un composant pour fonctionner correctement, chargez-le uniquement lorsque cela est nécessaire et non au lancement, ou utilisez un thread d'arrière-plan pour le charger après le démarrage de l'application. Essayez de rendre votre Application.onCreate() aussi léger que possible.

    Vous pouvez également bénéficier de l'utilisation de la bibliothèque App Startup pour initialiser les composants au démarrage de l'application. Dans ce cas, assurez-vous de charger tous les modules requis pour l'activité de démarrage et n'introduisez pas de saccades lorsque les modules chargés de manière différée deviennent disponibles.

  • Créez un espace réservé lors du chargement d'une petite quantité de données en local. Utilisez l'approche de thème recommandée et suspendez le rendu jusqu'à ce que l'application soit prête. Pour implémenter un écran de démarrage rétrocompatible, suivez les étapes décrites dans Conserver l'écran de démarrage à l'écran plus longtemps.

  • Afficher les espaces réservés. Pour les charges basées sur le réseau avec des durées indéterminées, fermez l'écran de démarrage et affichez des espaces réservés pour le chargement asynchrone. Envisagez d'appliquer des animations subtiles à la zone de contenu qui reflètent l'état de chargement. Assurez-vous que la structure du contenu chargé correspond autant que possible à la structure du squelette pour permettre une transition fluide lorsque le contenu est chargé.

  • Utiliser la mise en cache. Lorsqu'un utilisateur ouvre votre application pour la première fois, vous pouvez afficher des indicateurs de chargement pour certains éléments d'interface utilisateur, comme illustré dans la figure suivante. La prochaine fois que l'utilisateur reviendra dans votre application, vous pourrez afficher ce contenu mis en cache pendant que vous chargez du contenu plus récent.

Figure 1. Affichage des espaces réservés de l'interface utilisateur.