Si implementas una pantalla de presentación personalizada en Android 11 o versiones anteriores, migra 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 aplica la pantalla de presentación predeterminada del sistema Android en inicios semicalientes y en frío para todas las apps. De forma predeterminada, esta pantalla de presentación del sistema se crea con el elemento del ícono de selector de tu app y el windowBackground
del tema, si es de un solo color.
Si no migras tu app, es posible que la experiencia de inicio de tu app en Android 12 y versiones posteriores se degrade o tenga 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 por una pantalla de presentación predeterminada del sistema Android en Android 12 y versiones posteriores. Es posible que esta no sea la experiencia prevista de tu app.Si la pantalla de presentación existente se implementa con un
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 pantalla de presentación del sistema, seguida de la actividad de la pantalla de presentación existente.
Para evitar estas experiencias degradadas o no deseadas, completa el proceso de migración que se describe en este documento. Después de la migración, la API mejora el tiempo de inicio, te brinda control total sobre la experiencia de la pantalla de presentación y crea una experiencia de inicio más coherente con otras apps de 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. Este documento se escribe con la biblioteca
de compatibilidad.
Si migras con la API de SplashScreen
directamente, en Android 11 y versiones anteriores, la pantalla de presentación se verá igual que antes de la migración. A partir de Android 12, la pantalla de presentación tiene el estilo de Android 12.
Si migras con la biblioteca de compatibilidad SplashScreen
, el sistema mostrará la misma pantalla de presentación en todas las versiones de Android.
Cómo migrar la implementación de la pantalla de presentación
Completa los siguientes pasos para migrar la implementación existente de la pantalla de presentación a Android 12 y versiones posteriores.
Este procedimiento aplica para cualquier tipo de implementación desde el que realizas la migración. Si migras desde una Activity
dedicada, sigue las prácticas recomendadas que se describen en este documento para adaptar tu Activity
de pantalla de presentación personalizada. La API de SplashScreen
también reduce la latencia de inicio que se ingresa con una actividad dedicada de la pantalla de presentación.
Para migrar la pantalla de presentación, haz lo siguiente:
En el archivo
build.gradle
, cambia tucompileSdkVersion
y, luego, incluye la biblioteca de compatibilidadSplashScreen
en las dependencias.build.gradle android { compileSdkVersion 31 ... } dependencies { ... implementation 'androidx.core:core-splashscreen:1.0.0-beta02' }
Crea un tema con uno superior de
Theme.SplashScreen
. Establece el valor depostSplashScreenTheme
en el tema que debe usarActivity
y el valor dewindowSplashScreenAnimatedIcon
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 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 deseas agregar un color de fondo debajo del ícono, puedes usar el tema
Theme.SplashScreen.IconBackground
y configurar el atributowindowSplashScreenIconBackground
.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"> ...
Llama a
installSplashScreen
en la actividad inicial antes de llamar asuper.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 mantener la pantalla de presentación en la pantalla durante más tiempo. Si deseas 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 pantalla de presentación
Después de migrar a la pantalla de presentación para Android 12 y versiones posteriores, decide qué hacer con el Activity
de la pantalla de presentación personalizada anterior. Tienes las siguientes opciones:
- Conservar la actividad personalizada, pero evitar que se muestre
- Conservar la actividad personalizada por motivos de desarrollo de la marca
- Quita la actividad personalizada y adapta tu app según sea necesario.
Impedir que se muestre el objeto Activity personalizado
Si el Activity
de la pantalla de presentación anterior se usa principalmente para el enrutamiento, considera cómo quitarlo. Por ejemplo, puedes vincular directamente a la actividad real o pasar a una actividad única con subcomponentes. Si esto no es posible, usa SplashScreen.setKeepOnScreenCondition
para mantener la actividad de enrutamiento en su lugar, pero detener la renderización. De esta manera, se transferirá la pantalla de presentación a la siguiente actividad y se admitirá 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 deseas usar un Activity
de la pantalla de presentación anterior por motivos de desarrollo de la marca, puedes hacer la transición de la pantalla de presentación del sistema a tu Activity
de la pantalla de presentación personalizada. Para ello, personaliza la animación para descartar la pantalla de presentación.
Sin embargo, te recomendamos evitar esta situación siempre que sea posible y usar la API de SplashScreen
para incluir tu marca en la pantalla de presentación.
Si necesitas mostrar un diálogo, te recomendamos que lo muestres en la actividad posterior de la pantalla de presentación personalizada o en la actividad principal después de la pantalla de presentación del sistema.
Cómo quitar el objeto Activity de la pantalla de presentación personalizada
En general, recomendamos que quites el objeto Activity
de la pantalla de presentación personalizada anterior por completo para evitar la duplicación de las pantallas de presentación, aumentar la eficiencia y reducir los tiempos de carga de la pantalla de presentación. Hay diferentes técnicas que puedes usar para evitar mostrar actividades redundantes de la pantalla de presentación.
Usa la carga diferida para tus componentes, módulos o bibliotecas. Evita cargar o inicializar componentes o bibliotecas que no sean necesarios para que la app funcione en el inicio. Cárgalos más tarde, cuando la app los necesite.
Si tu app realmente necesita un componente para funcionar correctamente, cárgalo solo cuando realmente sea necesario y no en el momento de inicio, o usa un subproceso en segundo plano para 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 cuando se inicie la aplicación. Cuando lo hagas, asegúrate de cargar todos los módulos necesarios para la actividad de inicio y no introduzcas bloqueos en los que estén disponibles los módulos de carga diferida.
Crear un marcador de posición mientras se carga una pequeña cantidad de datos a nivel 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 sea retrocompatible, sigue los pasos descritos en Cómo mostrar la pantalla de presentación durante períodos más largos.
Muestra marcadores de posición. Para las cargas basadas en la red con duraciones indeterminadas, 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 esqueleto en la medida de lo posible para permitir una transición fluida cuando 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 la siguiente figura. La próxima vez que el usuario regrese a tu app, podrás mostrar este contenido almacenado en caché mientras cargas el contenido más reciente.