Criar uma Splash Screen real no Android

Uma Splash Screen ou Tela de abertura mal feita é um inferno. Você abre o aplicativo e as vezes tem que esperar 3 ou 4 segundos, as vezes ate 5 segundos com uma tela mostrando qual aplicativo você abriu. Isso faz você perder tempo desnecessário.

Mas essa tela tem uma utilidade, ela deve ser exibida na hora que seu aplicativo esta carregando, fazendo alguma tarefa necessária antes que o usuário possa utilizar seu aplicativo, ou seja o aplicativo demora um tempo para iniciar, especialmente a primeira vez que é aberto. Há um atraso que não se pode evitar. Em vez de deixar uma tela em branco durante este tempo, por que não mostrar ao usuário algo de bom? Esta é a abordagem que o Google está defendendo. Não desperdice o tempo do usuário, mas não mostre-lhes uma tela em branco do aplicativo na primeira vez que o lançam.

Se você olhar atualizações recentes para aplicativos do Google, verá os usos apropriados da tela inicial. Dê uma olhada no aplicativo do YouTube, por exemplo.

Implementando a Splash Screen

A implementação de uma tela inicial é um pouco diferente do que você imagina. A exibição de splash que você vê tem que estar pronta imediatamente, mesmo antes que você possa inflar um arquivo de layout em sua atividade de splash.

Então você não vai usar um arquivo de layout. Em vez disso, especifique o plano de fundo da tela inicial como o plano de fundo do tema da atividade. Para fazer isso, primeiro crie um XML desenhável em res/drawable.

<!--?xml version="1.0" encoding="utf-8"?-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
    <item android:drawable="@color/gray"></item>
 
    <item>
        <bitmap android:gravity="center" android:src="@mipmap/ic_launcher"></bitmap>
    </item>
 
</layer-list>

No código acima está sendo configurado uma cor de fundo e uma imagem para aparecer na splash.

Depois, iremos configurar isso como um background da atividade de splash no tema do app. No arquivo styles.xml adicione um tema para a tela de abertura.

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

    <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/background_splash</item>
    </style>

</resources>

No estilo criado SplashTheme está sendo definido como background o background_splash.xml criado mais a cima. Agora vamos crriar uma nova Activity no AndroidManifest.xml.

<activity android:name=".SplashActivity" android:theme="@style/SplashTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Não se esqueça de deixar essa nova activity como sendo a primeira chamada pelo app e nao mais a main.

Finalmente a classe SplashActivity terá apenas o create e a chamada para a MainActivity.

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}

Observe que nem mesmo criamos um layout para a activity. A visão vem do tema criado juntamente com o background da drawable.

Caso tivesse sido criado um arquivo de layout para a atividade da splash, ele só seria exibido para o usuário depois de o aplicativo ter sido totalmente carregado, o que seria tarde e tornaria a splash inútil.

A Splash Correta

Com essas etapas concluídas, você terá uma tela inicial implementada da forma correta: