Cómo migrar la implementación de la pantalla de presentación existente a Android 12 y versiones posteriores

Si ya implementaste una pantalla de presentación personalizada en Android 11 o versiones anteriores, deberás migrar tu app a la API de SplashScreen para asegurarte de que se muestre correctamente en Android 12 y versiones posteriores.

A partir de Android 12, el sistema siempre aplica la nueva pantalla de presentación predeterminada del sistema Android en inicios semicalientes y frío para todas las apps. De forma predeterminada, esta pantalla de presentación predeterminada del sistema se construye con el elemento del ícono de selector de la app y el objeto windowBackground del tema (si se trata de un solo color).

Si no migras la app, su experiencia de inicio en Android 12 y versiones posteriores se verá degradada o puede generar resultados imprevistos:

  • Si la pantalla de presentación existente se implementa con un tema personalizado que anula android:windowBackground, el sistema reemplazará la pantalla de presentación personalizada con una pantalla de presentación predeterminada del sistema Android en Android 12 y versiones posteriores (que es posible que no brinde la experiencia prevista de la app).

  • Si la pantalla de presentación existente se implementa con un objeto Activity dedicado, cuando se inicia la app en dispositivos que ejecutan Android 12 o versiones posteriores, se duplican las pantallas de presentación: se muestra la nueva pantalla de presentación del sistema y, luego, la actividad de la pantalla de presentación existente.

Para evitar estas experiencias degradadas o imprevistas, puedes completar el proceso de migración que se describe en esta guía. Una vez que realices la migración, la nueva API mejora el tiempo de inicio, te brinda control total sobre la experiencia de la pantalla de presentación y garantiza una experiencia de inicio más coherente con otras apps en la plataforma.

Biblioteca de compatibilidad de SplashScreen

Puedes usar la API de SplashScreen directamente, pero te recomendamos que, en su lugar, uses la biblioteca de compatibilidad de SplashScreen de AndroidX. La biblioteca de compatibilidad usa la API de SplashScreen, habilita la retrocompatibilidad y crea una apariencia coherente para la visualización de la pantalla de presentación en todas las versiones de Android. Esta guía se escribe con la biblioteca de compatibilidad.

Si decides migrar directamente con la API de SplashScreen, en Android 11 y versiones anteriores, la pantalla de presentación lucirá igual que antes. A partir de Android 12, esta pantalla tendrá la apariencia nueva de Android 12.

Cómo migrar la implementación de la pantalla de presentación

Sigue estos pasos a fin de migrar la implementación de la pantalla de presentación existente a la nueva experiencia para Android 12 y versiones posteriores.

Este procedimiento aplica para cualquier tipo de implementación desde el que realizas la migración. Si migras desde un objeto Activity dedicado, también debes seguir las prácticas recomendadas que se describen en este documento a fin de adaptar el objeto Activity de la pantalla de presentación personalizada. La nueva API de SplashScreen también reduce la latencia de inicio que se introdujo con una actividad dedicada de la pantalla de presentación.

Después de la migración mediante la biblioteca de compatibilidad de SplashScreen, el sistema mostrará la misma pantalla de presentación en todas las versiones de Android.

Para migrar la pantalla de presentación, haz lo siguiente:

  1. En el archivo build.gradle, cambia compileSdkVersion y, luego, incluye la biblioteca de compatibilidad de SplashScreen en las dependencias.

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-beta02'
    }
    
  2. Crea un tema con un elemento superior de Theme.SplashScreen y establece los valores de postSplashScreenTheme en el tema que Activity debe usar y windowSplashScreenAnimatedIcon en un elemento de diseño o un elemento de diseño animado. Los otros atributos son opcionales.

    <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 either 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. -->
       <!-- Required -->
       <item name="postSplashScreenTheme">@style/Theme.App</item>
    </style>
    

    Si deseas agregar un color de fondo debajo del ícono, puedes usar el tema Theme.SplashScreen.IconBackground y configurar el atributo windowSplashScreenIconBackground.

  3. En el manifiesto, reemplaza el tema de la actividad inicial por el tema que creaste en el paso anterior.

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  4. Llama a installSplashScreen en la actividad inicial antes de llamar a 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 muestra el objeto de la pantalla de presentación, que puedes usar de manera opcional para personalizar la animación o mostrar la pantalla de presentación durante períodos más largos. A fin de obtener más detalles para personalizar la animación, consulta Cómo mostrar la pantalla de presentación durante períodos más largos y Cómo personalizar la animación para descartar la pantalla de presentación.

Cómo adaptar el objeto Activity de la pantalla de presentación personalizada a la nueva experiencia de la pantalla de presentación

Después de migrar a la nueva experiencia de la pantalla de presentación para Android 12 y versiones posteriores, todavía queda el objeto Activity de la pantalla de presentación personalizada, por lo debes decidir qué hacer con este. Tienes las siguientes opciones:

  • Conservar el objeto Activity personalizado, pero impedir que se muestre
  • Conservar el objeto Activity personalizado por motivos relacionados con el desarrollo de la marca
  • Quitar el objeto Activity personalizado y adaptar la app según sea necesario

Cómo evitar que se muestre el objeto Activity personalizado

Si el objeto Activity de la pantalla de presentación existente se usa principalmente para el enrutamiento, considera maneras de quitarlo. Por ejemplo, puedes vincular de manera directa la actividad real o pasar a una actividad única con subcomponentes. Si esto no es posible, puedes usar SplashScreen#setKeepOnScreenCondition para mantener la actividad de enrutamiento en su lugar, pero detener la renderización. De esta manera, se transfiere la pantalla de presentación a la siguiente actividad y se permite una transición 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();
    }
  ...
  

Cómo mantener el objeto Activity personalizado para el desarrollo de la marca

Si desear usar el objeto Activity de una pantalla de presentación posterior para una experiencia de desarrollo de la marca, puedes realizar una transición de la pantalla de presentación del sistema al objeto Activity de la pantalla de presentación personalizada. Con este fin, personaliza la animación para descartar la pantalla de presentación. Sin embargo, es mejor evitar esta situación si es posible y usar la nueva API de SplashScreen para desarrollar la marca de la pantalla de presentación.

Cómo quitar el objeto Activity de la pantalla de presentación personalizada

Por lo general, te recomendamos que quites el objeto Activity de la pantalla de presentación personalizada por completo para evitar que no se migre la duplicación de las pantallas de presentación, aumentes la eficiencia y reduzcas los tiempos de carga de la pantalla de presentación. Puedes usar diferentes técnicas para evitar que se muestre una actividad redundante de la pantalla de presentación.

  • Carga de forma diferida componentes, módulos o bibliotecas: Evita cargar o inicializar componentes o bibliotecas que no se necesiten para que la app funcione en el momento de inicio y cárgalos más tarde cuando la app los necesite.

    Si tu app, en realidad, necesita un componente para funcionar de manera correcta, cárgalo solo cuando en verdad sea necesario, en lugar de en el momento de inicio. También puedes usar un subproceso en segundo plano a fin de cargarlo después de que se inicie la app. Intenta que Application onCreate() sea lo más liviano posible.

    También puedes beneficiarte del uso de la biblioteca de App Startup para inicializar componentes en el momento de inicio una aplicación. Cuando lo hagas, asegúrate de cargar todos los módulos necesarios para la actividad inicial y no introduzcas los bloqueos en los que estén disponibles los módulos de carga diferida.

  • Crea un marcador de posición mientras cargas una pequeña cantidad de datos de manera local: Usa el enfoque de temas recomendado y detén la renderización hasta que la app esté lista. Para implementar una pantalla de presentación que brinde retrocompatibilidad, sigue los pasos que se describen en Cómo mostrar la pantalla de presentación durante períodos más largos.

  • Muestra los marcadores de posición: En las cargas basadas en la red con duraciones indefinidas, descarta la pantalla de presentación y muestra los marcadores de posición para la carga asíncrona. Considera aplicar animaciones sutiles al área de contenido que reflejen el estado de carga. Asegúrate de que la estructura del contenido cargado coincida con la estructura del esquema en la mayor medida posible para permitir una transición fluida, una vez que se cargue el contenido.

  • Usa el almacenamiento en caché: Cuando un usuario abre tu app por primera vez, puedes mostrar indicadores de carga para algunos elementos de la IU (como se muestra en el siguiente ejemplo). La próxima vez que un usuario vuelva a abrir la app, podrás mostrar este contenido almacenado en caché mientras cargas contenido más reciente.

    Figura 1: Se muestran los marcadores de posición de la IU