Criando uma Splash Screen em Android

Nesse post eu explicarei como criar um splash screen para a sua aplicação utilizando uma Activity como splash que chamará a Activity principal do programa. Nesse exemplo, como Activity principal, vamos utilizar uma com um TextView escrito HelloWorld. O layout da Activity principal (layout/activity_main.xml) possui o seguinte conteudo:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />

</RelativeLayout>

E da classe MainActivity.java:

package br.com.thiagovespa.android.sample.samplesplashscreen;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

}

O primeiro passo é criar em uma aplicação existente uma Activity com o nome SplashScreenActivity. Adicione uma imagem no layout dela. Você deverá ter um resultado semelhante à esse no arquivo de layout (activity_splash_scree.xml):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:contentDescription="@string/splash"
        android:src="@drawable/ic_launcher" />

</RelativeLayout>

Na classe java do Activity criado (SplashScreenActivity.java) vamos adicionar um TimerTask para exibir o splash por alguns segundos e depois chamar a tela do MainActivity.java. O resultado será o seguinte:

package br.com.thiagovespa.android.sample.samplesplashscreen;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class SplashScreenActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen);

		new Timer().schedule(new TimerTask() {

			@Override
			public void run() {
				finish();

				Intent intent = new Intent();
				intent.setClass(SplashScreenActivity.this, MainActivity.class);
				startActivity(intent);
			}
		}, 6000);
    }

}

O TimerTask na linha 17 será executado após 6 segundos (linha 27). Após isso finalizamos a Activity para que o botão de voltar não funcione (linha 21). Da linha 23 à 25 chamamos a MainActivity. Poderíamos ter a mesma solução utilizando Threads. O motivo de não utlizar Threads é porque o foco é diferente. O Timer e o TimerTaks são componentes de mais alto-nível com o propósito de executar ações agendadas recorrentes ou após um determinado tempo (que é o nosso foco). Existe também a possibilidade de utilizar AsyncTask para, por exemplo, executar operações enquanto é feito a exibição do splash screen. Você pode encontar mais informações nesse link.

Edite o arquivo AndroidManifest.xml para que o SplashScreenActivity seja a Activity principal:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.thiagovespa.android.sample.samplesplashscreen"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
        </activity>
        <activity
            android:name=".SplashScreenActivity"
            android:label="@string/title_activity_splash_screen" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Agora é só executar. Caso tenha dúvida, você pode fazer o download do projeto.

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6