Lanzar un servicio al iniciar Android

Un servicio en el sistema operativo Android y al igual que en otros sistemas operativos, se refiere a una parte de una aplicación instalada, la cual se sigue ejecutando en segundo plano, incluso si se ha salido de la aplicación. Durante la ejecución del servicio, puede estar visible de alguna manera (con la aplicación abierta o con una notificación en la barra de tareas) o bien oculta, ya que un servicio no tiene interfaz gráfica. En este último caso habría que ir a la lista de aplicaciones en ejecución (desde ajustes) para comprobar que está en marcha.

Los servicios suelen estar en espera a recibir una señal para activar una acción. Ejemplos de esto puede ser la aplicación Whatsapp, Telegram o Line; cuando el servicio está en ejecución a la espera de recibir mensajes. Y cuando los recibe el servicio lanza una notificación para que el usuario sepa que le ha llegado un nuevo mensaje y puede acceder a la aplicación para leerlo. En estos casos, lo ideal es que el servicio se lance en el mismo momento que se enciende el móvil, cuando el sistema Android acaba de arrancar. Sin embargo, también podría utilizarse para realizar una única acción al iniciar el móvil y finalizar el servicio, eso ya dependerá de las necesidades de la aplicación.

A continuación, se muestra un ejemplo de cómo lanzar un servicio al iniciar Android. Lo primero será crear la clase que hará de Receiver. Este tipo de clases, reaccionan cuando se recibe algún anuncio broadcast. En concreto, en el manifiesto se configurará que se active cuando se reciba el anuncio de que el sistema Android se ha terminado de cargar, como se verá un poco más adelante.

ReceiverBoot

package com.example.onboot;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class ReceiverBoot extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Lanzar Servicio
        Intent serviceIntent = new Intent();
        serviceIntent.setAction("com.example.onboot.MyService");  //TODO Cambiar por nombre de servicio y paquete usados
        context.startService(serviceIntent);
        // Lanzar actividad
        Intent i = new Intent(context, Main.class);
        // Cuando se intenta abrir una Activity desde un componente que no sea una actividad 
	// se debe de avisar mediante un Flag que está siendo iniciada por un componente alternativo. 
	i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

ServiceBoot

A continuación, la clase ServiceBoot, que es el servicio de Android en sí, que se ejecutará en segundo plano. Interesan dos métodos:

  • onCreate(). Se ejecuta cuando se inicia el servicio, aquí irá lo que se quiera que se ejecute por parte del servicio.
  • onDestroy(). Se ejecuta justa antes de eliminar el servicio. Se puede usar, por ejemplo, para limpiar variables o para guardar datos o tiempos generados en la ejecución del servicio.
package com.example.onboot;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class ServiceBoot extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this, "Servicio creado", Toast.LENGTH_LONG).show();
        Log.d("EJEMPLOONBOOT", "Servicio creado");
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Servicio destruido", Toast.LENGTH_LONG).show();
        Log.d("EJEMPLOONBOOT", "Servicio destruido");

    }

}

AndroidManifest.xml

Con las dos clases anteriores, ya estaría todo el código necesario. Ahora sólo quedaría la parte de configuración, la cual se realiza como siempre desde el AndroidManifest. El contenido del mismo podría ser el siguiente.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.onboot" android:versioncode="1" android:versionname="1.0">

    <uses-sdk android:minsdkversion="8">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">

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

        <service android:name=".ServiceBoot">
            <intent-filter>
                <action android:name="com.example.onboot.MyService">
            </action></intent-filter>
        </service>

        <receiver android:name=".ReceiverBoot">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED">
                <category android:name="android.intent.category.HOME">
            </category></action></intent-filter>
        </receiver>
    </application>

</uses-permission></uses-sdk></manifest>

A destacar, que se debe conceder el permiso llamado RECEIVE_BOOT_COMPLETE, que es el que habilita que se pueda capturar el evento de cuando se ha terminado de cargar el sistema Android y que dará el pistoletazo de salida para iniciar el servicio que se ha creado. Este evento o acción, se ha definido como un intent-filter para el receiver que se ha llamado ReceiverBoot, el cual se encarga de llamar al servicio en sí. En esta llamada, se llama al servicio llamado MyService que, como se observa en el manifiesto, se corresponde con la clase ServiceBoot.

Con esto, ya se puede lanzar un servicio al iniciar Android y es genérico siempre que se quiera realizar. A partir de aquí, ya habrá que implementar el código necesario según lo que se quiera que haga el servicio.

Deja un comentario

Pin It on Pinterest