Migrar a implementação da tela de apresentação para o Android 12 e versões mais recentes

Se você implementar uma tela de apresentação personalizada no Android 11 ou versões anteriores, migre o app para a API SplashScreen para ajudar a garantir que ela seja exibida corretamente no Android 12 e versões mais recentes.

No Android 12 e versões mais recentes, o sistema aplica a tela de apresentação padrão do sistema Android em inicializações a frio e com estado salvo para todos os apps. Por padrão, essa tela de apresentação do sistema é criada usando o elemento do ícone na tela de início do app e o windowBackground do tema, se ele tiver uma única cor.

Se você não migrar o app, a experiência de inicialização no Android 12 e versões mais recentes poderá ser prejudicada ou ter resultados indesejados.

  • Se a tela de apresentação existente for implementada usando um tema personalizado que substitui android:windowBackground, o sistema vai substituir essa tela por uma tela de apresentação padrão do sistema Android no Android 12 e versões mais recentes. Essa pode não ser a experiência pretendida do seu app.

  • Se a tela de apresentação existente for implementada usando um Activity dedicado, iniciar o app em dispositivos com o Android 12 ou versões mais recentes vai resultar em telas de apresentação duplicadas: a tela de apresentação do sistema será mostrada, seguida pela atividade da tela de apresentação existente.

Para evitar essas experiências degradadas ou não intencionais, conclua o processo de migração descrito neste documento. Após a migração, a API melhora o tempo de inicialização, oferece controle total sobre a experiência da tela de apresentação e cria uma experiência de inicialização mais consistente com outros apps na plataforma.

Biblioteca de compatibilidade SplashScreen

Você pode usar a API SplashScreen diretamente, mas recomendamos o uso da biblioteca de compatibilidade SplashScreen do AndroidX. Essa biblioteca usa a API SplashScreen, permite a compatibilidade com versões anteriores e cria uma aparência consistente para a tela de apresentação em todas as versões do Android. Este documento foi escrito usando a biblioteca de compatibilidade.

Se você migrar usando a API SplashScreen diretamente, no Android 11 e versões anteriores, a tela de apresentação vai ser exatamente igual a antes da migração. A partir do Android 12, a tela de apresentação tem a aparência do Android 12.

Se você migrar usando a biblioteca de compatibilidade SplashScreen, o sistema vai mostrar a mesma tela de apresentação em todas as versões do Android.

Migrar a implementação da sua tela de apresentação

Conclua as etapas a seguir para migrar a implementação da tela de apresentação existente para o Android 12 e versões mais recentes.

Este procedimento se aplica a qualquer tipo de implementação de onde você esteja migrando. Se você estiver migrando de uma Activity dedicada, siga as práticas recomendadas descritas neste documento para adaptar a tela de apresentação personalizada Activity. A API SplashScreen também reduz a latência de inicialização, introduzida com uma atividade de tela de apresentação dedicada.

Para migrar a tela de apresentação, faça o seguinte:

  1. No arquivo build.gradle, mude o compileSdkVersion e inclua a biblioteca de compatibilidade SplashScreen nas dependências.

    build.gradle
    
    android {
       compileSdkVersion 31
       ...
    }
    dependencies {
       ...
       implementation 'androidx.core:core-splashscreen:1.0.0-beta02'
    }
    
  2. Crie um tema com um pai de Theme.SplashScreen. Defina o valor de postSplashScreenTheme como o tema que o Activity precisa usar e o valor de windowSplashScreenAnimatedIcon como um drawable ou um drawable animado. Os outros atributos são opcionais.

    <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 quiser adicionar uma cor ao plano de fundo abaixo do ícone, use o tema Theme.SplashScreen.IconBackground e defina o atributo windowSplashScreenIconBackground.

  3. No manifesto, substitua o tema da atividade inicial pelo tema criado na etapa anterior.

    <manifest>
       <application android:theme="@style/Theme.App.Starting">
        <!-- or -->
            <activity android:theme="@style/Theme.App.Starting">
    ...
    
  4. Chame installSplashScreen na atividade inicial antes de 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 retorna o objeto da tela de apresentação, que pode ser usado para personalizar a animação ou manter a tela de apresentação na tela por mais tempo. Para ver mais detalhes sobre como personalizar a animação, consulte Manter a tela de apresentação na tela por períodos mais longos e Personalizar a animação para dispensar a tela de apresentação.

Adaptar a atividade da tela de apresentação personalizada à tela de apresentação

Depois de migrar para a tela de apresentação do Android 12 e versões mais recentes, decida o que fazer com a tela de apresentação personalizada anterior Activity. Você tem as seguintes opções:

  • Manter a atividade personalizada, mas impedir que ela seja exibida.
  • Mantenha a atividade personalizada por motivos de branding.
  • Remova a atividade personalizada e adapte o app conforme necessário.

Impedir que a atividade personalizada seja exibida

Se a tela de apresentação anterior Activity for usada principalmente para roteamento, considere maneiras de removê-la. Por exemplo, é possível vincular diretamente à atividade real ou passar para uma atividade única com subcomponentes. Se isso não for viável, use SplashScreen.setKeepOnScreenCondition para manter a atividade de roteamento, mas impedir a renderização. Isso transfere a tela de apresentação para a próxima atividade e permite uma transição tranquila.

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

Manter a atividade personalizada de branding

Se você quiser usar uma Activity de tela de apresentação anterior por motivos de branding, faça a transição da tela de apresentação do sistema para a tela de apresentação personalizada Activity personalizando a animação para dispensar a tela de apresentação. No entanto, é melhor evitar esse cenário, se possível, e usar a API SplashScreen para marcar sua tela de apresentação.

Se você precisar mostrar uma caixa de diálogo, recomendamos fazer isso na atividade da tela de apresentação personalizada subsequente ou sobre a atividade principal após a tela de apresentação do sistema.

Remover a atividade da tela de apresentação personalizada

Geralmente, recomendamos remover completamente o Activity da tela de apresentação personalizada anterior para evitar a duplicação de telas de apresentação, aumentar a eficiência e reduzir os tempos de carregamento da tela de apresentação. Há diferentes técnicas que podem ser usadas para evitar a exibição de atividades redundantes na tela de apresentação.

  • Use o carregamento lento em componentes, módulos ou bibliotecas. Evite carregar ou inicializar componentes ou bibliotecas que não são necessários para que o app funcione na inicialização. Carregue-os mais tarde, quando o app precisar.

    Se o app realmente precisar que um componente funcione corretamente, carregue-o somente quando ele for realmente necessário, e não no momento da inicialização, ou use uma linha de execução em segundo plano para carregá-lo após a inicialização do app. Tente manter seu Application.onCreate() o mais leve possível.

    Você também pode se beneficiar do uso da biblioteca App Startup para inicializar componentes na inicialização do aplicativo. Ao fazer isso, carregue todos os módulos necessários para a atividade inicial e não introduza instabilidades em que os módulos com carregamento lento fiquem disponíveis.

  • Criar um marcador ao carregar uma pequena quantidade de dados localmente. Use a abordagem de temas recomendada e restrinja a renderização até que o app esteja pronto. Para implementar uma tela de apresentação compatível com versões anteriores, siga as etapas descritas em Manter a tela de apresentação na tela por períodos mais longos.

  • Mostrar marcadores de posição. Para carregamentos baseados em rede com durações indeterminadas, dispense a tela de apresentação e mostre marcadores para carregamento assíncrono. Considere aplicar animações sutis à área de conteúdo que reflete o estado de carregamento. Confira se a estrutura do conteúdo carregada corresponde à estrutura esqueleto e se ela oferece suporte a uma transição suave quando o conteúdo é carregado.

  • Use o armazenamento em cache. Quando um usuário abre o app pela primeira vez, você pode mostrar indicadores de carregamento para alguns elementos da interface, como mostrado na figura abaixo. Na próxima vez que o usuário retornar ao app, você poderá mostrar esse conteúdo em cache enquanto carrega o conteúdo mais recente.

Figura 1. Mostrando marcadores de interface.