Se você implementar uma tela de apresentação personalizada no Android 11 ou em versões anteriores, migre o
app para a API SplashScreen
para ajudar a
garantir que ele seja exibido corretamente no Android 12 e em versões mais recentes.
A partir do Android 12, 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 é 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 poderá ser degradada 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 sua tela de apresentação personalizada por uma tela de apresentação padrão do Android 12 e versões mais recentes. Essa 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 tela de apresentação do sistema será exibida, seguida pela atividade da tela de apresentação atual.
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 em versões anteriores
a tela de apresentação vai ser exatamente igual à anterior. 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 de 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 sua
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:
No arquivo
build.gradle
, mude seucompileSdkVersion
e inclua a biblioteca de compatibilidadeSplashScreen
nas dependências.build.gradle android { compileSdkVersion 31 ... } dependencies { ... implementation 'androidx.core:core-splashscreen:1.0.0-beta02' }
Crie um tema com um pai de
Theme.SplashScreen
. Defina o valor depostSplashScreenTheme
como o tema que oActivity
precisa usar e o valor dewindowSplashScreenAnimatedIcon
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 atributowindowSplashScreenIconBackground
.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"> ...
Chame
installSplashScreen
na atividade inicial antes desuper.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 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 à 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.
- Manter a atividade personalizada por motivos de branding.
- Remova a atividade personalizada e adapte seu app conforme necessário.
Impedir que a atividade personalizada seja exibida
Se a Activity
da tela de apresentação anterior 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. Fazer 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 tela de apresentação anterior Activity
por motivos 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 API SplashScreen
para exibir sua tela de apresentação.
Se você precisar mostrar uma caixa de diálogo, recomendamos que ela apareça sobre a 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
Em geral, recomendamos remover a tela de apresentação personalizada anterior Activity
totalmente 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
você pode usar para evitar a exibição de atividades de tela de apresentação redundantes.
Use o carregamento lento para 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. Carregue-os mais tarde, quando o app precisar deles.
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 inicializar 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.
Crie 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 mais tempo.
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. 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 quando o conteúdo for 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 a seguir. Na próxima vez que o usuário retornar ao app, você poderá mostrar esse conteúdo em cache enquanto carrega conteúdo mais recente.