Crear un "Splash Screen" sencillo en Android

Ahora vamos a intentar de crear un "splash screen" sencillo para Android. Un "splash screen" o pantalla de acogida no es más que un texto, imagen o programa liviano que cargamos a la espera de cargar todo el contenido completo de nuestro programa.

Este tipo de programas son creados con la clara idea de publicitar la empresa y/o amenizar la espera durante los tiempos de carga, de ahí que haya dicho programa liviano.

Bien, vamos al grano, yo este lo he realizado con un proyecto completamente limpio denominado "SplashScreen", para el que no lo recuerde puede encontrar como crear un proyecto en mi publicación programando Android en Ubuntu 11.10 (II) en la parte final.

Ahora tenemos que comenzar a configurar la actividad referente a nuestro "splash screen", para ello comenzaremos por el XML que contendrá los datos que usaremos en esta actividad, este fichero que yo he denominado "splash_activity.xml" tiene que estar situado en "/SplashScreen/res/layout".

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

<TextView 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:textSize ="18sp"
    android:text="@string/hello_world_2"
    />
</LinearLayout>

Ya que estamos en la carpeta nos aseguramos de que tengamos un XML para la actividad principal, este no hará falta tocarlo, pero por si acaso, su contenido tendría que tener esta forma si hace o no hace.

<?xml version="1.0" encoding="utf-8"?>
<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>

Ahora tenemos que editar el "AndroiManifest.xml" para que contemple la nueva actividad que tiene que hacer, podéis encontrar una descripción más detallada del "AndroidManifest.xml" en mi entrada AndroidManifest.xml, que es y para que sirve en este mismo blog. Tal y como explique en este fichero pondremos cualquier actividad, servicio, etc. que necesitemos ejecutar, de esta manera podremos ver como nos quedaran dos actividades prácticamente iguales la una a la otra.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="lfr.liem.dazkun.test.android.splashscreen"
    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=".SplashScreen"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

Ahora vamos a los ficheros Java que tenemos en la carpeta "src", tenemos que tener dos ficheros, el "MainActivity.java" y el "SplashScreen.java", fijaros que los nombres coinciden con los que asignamos en el "AndroiManifest.xml" en la parte de " android:name=".MainActivity""  y "android:name=".SplashScreen"". 
El fichero Java principal en un principio no hay que tocarlo, es más, si lo tocáis corre por vuestra propia cuenta y riesgo. De manera que veamos que es lo que sucede con el "SplashScreen.java" que es el que se iniciara en primera instancia.

package lfr.liem.dazkun.test.android.splashscreen;

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

public class SplashScreen extends Activity {

 /** Se le llama cuando la actividad es creada por primera vez*/
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        
        //Creamos un objeto de tipo SplashHandler
        SplashHandler mHandler = new SplashHandler();
        //Le seteamos cual es el XML va a usar como configurador de la actividad
        setContentView(R.layout.splash_activity);
        //Creamos un objeto de tipo Message
        Message msg = new Message();
        //Asignamos un codigo unico al mensaje
        //Despues este codigo sera utilizado para identificar el mensaje.
        msg.what = 0;
        //Enviamos el mensaje que durara 3 segundos (3000 = 3 seg)
        mHandler.sendMessageDelayed(msg, 3000);
    }     
    
    //La clase Handler implementa 'handle' el manejador de los mensajes
    private class SplashHandler extends Handler {
        
     //Este metodo se usa para manejar los mensajes recibidos. 
        public void handleMessage(Message msg)
          {

            final Intent intent = new Intent();
            //switch del identificador del mensaje segun su codigo
            switch (msg.what) {
            case 0:
             super.handleMessage(msg);
             //Creamos un intent para arrancar la actividad
             //Nuestra intención es comenzar MainActivity
             intent.setClass(SplashScreen.this,MainActivity.class);
             startActivity(intent);
             // finalizamos la actual actividad
             SplashScreen.this.finish();
             break;
            default:
             //Duplicamos el codigo por que solo tenemos un splash screen
             //si tuvieramos alguno que tuviera que salir en caso de fallo lo pondriamos aquí
                super.handleMessage(msg);
                intent.setClass(SplashScreen.this,MainActivity.class);
                startActivity(intent);
                SplashScreen.this.finish();
                break;
            }
          }
    }    
   

}

El onCreate es como el que tendremos en cualquiera de nuestras actividades, sencillamente inicializa y llama a su XML el cual contendrá el texto que visualizaremos y la asignación del mensaje que visualizaremos.

El objeto Handler es un controlador de mensajes que nos enviara el mensaje durante tres segundos.

La clase SplashHandler lo que hace es crear un nuevo hilo que mostrara el nuestra pantalla de inicio, el objeto Intent se ocupara de realizar la transición desde nuestro "SplashScreen" a nuestra clase principal, startActivity(intent); arrancaria esa actividad mientras que SplashScreen.this.finish(); haría que nuestra actividad finalizara. El codigo se ha repetido dos veces aunque no sea necesario, pero en toda clausula "switch" tiene que haber una opción "default:" y no quería dejarla en blanco.