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:
No arquivo
build.gradle
, mude ocompileSdkVersion
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 tema criado 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 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.