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 em versões anteriores, migre app à API SplashScreen para ajudar confira se ele é exibido corretamente no Android 12 e versões mais recentes.

A partir do Android 12, o sistema aplica a tela inicial padrão do sistema Android tela ativada frio e quente inicial para todos os apps. Por padrão, Essa tela de apresentação do sistema é construída usando o elemento de ícone na tela de início do app e os windowBackground dos seus tema, se for de uma única cor.

Se você não migrar o app, a experiência de inicialização dele no Android 12 e depois pode ser degradado ou ter resultados não intencionais.

  • Se a tela de apresentação atual for implementada usando um tema personalizado que substitui android:windowBackground, o sistema substitui a tela de apresentação personalizada por um sistema Android padrão tela de apresentação no Android 12 e mais recentes. Esta pode não ser a intenção do usuário.

  • Se a tela de apresentação atual for implementada usando um Activity dedicado, iniciar o app em dispositivos com o Android 12 ou versões mais recentes resulta em telas de apresentação duplicadas: tela de apresentação do sistema e pela atividade da tela de apresentação atual.

Para evitar essas experiências degradadas ou não intencionais, conclua a o processo de migração descrito neste documento. Depois da migração, a API melhora o tempo de inicialização, oferece controle total sobre a experiência na tela de apresentação, e cria uma experiência de lançamento mais consistente com outros apps da 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 interface biblioteca.

Se você migrar usando a API SplashScreen diretamente no Android 11 e versões anteriores a tela de apresentação tem exatamente a mesma aparência de antes da migração. A partir de No 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 tela de apresentação atual no 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 um Activity dedicado, siga as recomendações práticas descritas neste documento para adaptar suas tela de apresentação personalizada Activity. A API SplashScreen também reduz a inicialização latência 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 seu 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 ao tema que o Activity precisa usar e o de windowSplashScreenAnimatedIcon para um drawable ou uma animação drawable. 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 que você criar 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 você pode opcionalmente use para personalizar a animação ou manter a tela de apresentação na tela por mais tempo duração Para obter mais detalhes sobre como personalizar a animação, consulte Manter a tela de apresentação na tela por mais tempo e Personalize a animação para dispensar a tela de apresentação.

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

Após migrar para a tela de apresentação do Android 12 e versões mais recentes, decida o que a ver com sua tela de apresentação personalizada anterior, o Activity. Você tem o seguinte opções:

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

Impedir a exibição da atividade personalizada

Se a tela de apresentação anterior Activity for usada principalmente para roteamento, pense em maneiras de removê-lo. Por exemplo, é possível criar um link direto para a página ou passar para uma única atividade com subcomponentes. Se não for viável, você pode usar SplashScreen.setKeepOnScreenCondition para manter a atividade de roteamento, mas impedir que ela seja renderizada. Ao fazer isso transfere a tela de apresentação para a próxima atividade e permite uma a transição.

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 tela de apresentação anterior Activity por motivos de branding, pode fazer a transição da tela de apresentação do sistema para uma personalizada Activity ao personalizar a animação para dispensar a apresentação tela. No entanto, é melhor evitar esse cenário, se possível, e usar o SplashScreen API para promover sua tela de apresentação.

Se você precisar exibir uma caixa de diálogo, recomendamos exibi-lo na atividade de 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 a tela de apresentação personalizada anterior Activity. para evitar a duplicação de telas de apresentação, aumentar a eficiência, e reduzir o tempo de carregamento da tela de apresentação. Há diferentes técnicas que que podem ser usadas para evitar a exibição de atividades redundantes da tela de apresentação.

  • Use o carregamento lento para componentes, módulos ou bibliotecas. Evitar o carregamento ou inicializar componentes ou bibliotecas que não são necessários para o app trabalhar no lançamento. Carregá-las mais tarde, quando o app precisar delas.

    Se seu aplicativo realmente precisar que um componente funcione corretamente, carregue-o somente quando estiver 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 aproveitar o 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 introduzir instabilidade onde a módulos com carregamento lento ficam disponíveis.

  • Crie um marcador de posição ao carregar uma pequena quantidade de dados localmente. Use o abordagem recomendada do tema e reter a renderização até que o app seja pronta. Para implementar uma tela de apresentação compatível com versões anteriores, siga as etapas descritas em Mantenha a tela de apresentação na tela por mais tempo.

  • Mostrar marcadores de posição. Para cargas baseadas em rede com durações indeterminadas, dispensar a tela de apresentação e mostrar marcadores de posição para carregamento assíncrono. Considere aplicar animações sutis à área de conteúdo que reflete o estado de carregamento. Verifique se a estrutura de conteúdo carregada corresponde ao estrutura esqueleto o máximo possível para oferecer uma transição suave quando o conteúdo for carregado.

  • Usar o armazenamento em cache. Quando um usuário abre seu app pela primeira vez, você pode mostrar indicadores de carregamento para alguns elementos da interface, conforme mostrado na figura a seguir. A na próxima vez que o usuário retornar ao app, você poderá mostrar esse conteúdo em cache enquanto ao carregar conteúdo mais recente.

.
Figura 1. Mostrando marcadores de posição da interface.