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

Caso você já tenha implementado uma tela de apresentação personalizada no Android 11 ou em versões anteriores, vai ser necessário migrar o app para a API SplashScreen para garantir que ela seja exibida corretamente no Android 12 e versões mais recentes.

A partir do Android 12, o sistema sempre aplica a nova tela de apresentação padrão do sistema Android em inicializações a frio e inicializações com estado salvo para todos os apps. Por padrão, essa tela de apresentação padrão do sistema é construída usando o elemento de í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 será degradada ou poderá ter resultados indesejados:

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

  • Se a tela de apresentação for implementada usando uma Activity dedicada, a inicialização do app em dispositivos com o Android 12 ou versões mais recentes resultará em telas de apresentação duplicadas: a nova tela de apresentação do sistema, 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 guia. Após a migração, a nova API melhora o tempo de inicialização, oferece controle total sobre a experiência da tela de apresentação e garante 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 guia foi escrito usando a biblioteca de compatibilidade.

Se você escolher migrar usando a API SplashScreen diretamente no Android 11 ou em versões anteriores, sua tela de apresentação vai ser exatamente igual à anterior. No Android 12 e versões mais recentes, a tela de apresentação vai ter a nova aparência do Android 12.

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

Conclua as etapas a seguir para migrar a implementação de tela de apresentação existente para a nova experiência do 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 também as práticas recomendadas descritas neste documento para adaptar a tela de apresentação personalizada Activity. A nova API SplashScreen também reduz a latência de inicialização introduzida com uma atividade de tela de apresentação dedicada.

Depois da migração usando a biblioteca de compatibilidade SplashScreen, o sistema exibe a mesma tela de apresentação em todas as versões do Android.

Para migrar a tela de apresentação:

  1. No arquivo build.gradle, mude sua 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 da Theme.SplashScreen e defina os valores de postSplashScreenTheme para o tema que a Activity precisa usar e windowSplashScreenAnimatedIcon para 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 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>
    

    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 que você criou 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 visível por mais tempo. Para ver mais detalhes sobre como personalizar a animação, consulte Manter a tela de apresentação visível por períodos mais longos e Personalizar a animação para dispensar a tela de apresentação.

Adaptar a atividade de tela de apresentação personalizada à nova experiência de tela de apresentação

Depois de migrar para a nova experiência da tela de apresentação do Android 12 e versões mais recentes, sua Activity da tela de apresentação personalizada ainda vai estar disponível, então você precisa escolher o que fazer com ela. Você tem as seguintes opções:

  • Manter a atividade personalizada, mas impedir que ela seja exibida.
  • Manter a atividade personalizada por motivos de branding.
  • Remover a atividade personalizada e adaptar seu app conforme necessário.

Impedir a exibição da atividade personalizada

Se a Activity da tela de apresentação existente for usada principalmente para roteamento, considere como removê-la. Por exemplo, é possível vincular diretamente à atividade real ou usar 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 dela. Essa ação vai transferir a tela de apresentação para a próxima atividade e permitirá 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

Caso queira usar uma Activity de tela de apresentação subsequente para uma experiência de branding, é possível fazer a transição da tela de apresentação do sistema para a tela de apresentação personalizada Activity configurando a animação para dispensar a tela de apresentação. No entanto, é melhor evitar esse cenário, se possível, e usar a nova API SplashScreen para exibir sua tela de apresentação.

Remover a atividade da tela de apresentação personalizada

Em geral, é recomendável remover a Activity de tela de apresentação personalizada totalmente para evitar a duplicação de telas de apresentação não migradas, aumentar a eficiência e reduzir os tempos de carregamento da tela de apresentação. Há diferentes técnicas que você pode usar para evitar a exibição de atividades de tela redundantes.

  • Carregar lentamente seus componentes, módulos ou bibliotecas: evite carregar ou inicializar componentes ou bibliotecas que não sejam necessários para que o app funcione na inicialização e carregue-os posteriormente, quando o app precisar.

    Se o app realmente precisar de um componente para funcionar da forma correta, carregue-o somente quando ele for 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.

    Também é possível usar a biblioteca App Startup para ativar componentes na inicialização do aplicativo. Ao fazer isso, lembre-se de carregar todos os módulos necessários para a atividade inicial e de não introduzir instabilidades em que os módulos de carregamento lento estejam disponíveis.

  • Criar um marcador ao carregar uma pequena quantidade de dados localmente: use a abordagem de temas recomendada e retenha 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: 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. Certifique-se de que a estrutura de conteúdo carregada corresponda à estrutura básica o máximo possível para permitir uma transição tranquila, assim que o conteúdo for carregado.

  • Usar cache: quando um usuário abre o app pela primeira vez, você pode mostrar indicadores de carregamento para alguns elementos da IU, como no exemplo abaixo. Na próxima vez que um usuário retornar ao app, você poderá exibir esse conteúdo em cache enquanto carrega conteúdo mais recente.

    Figura 1: exibição de marcadores de IU