Buenas,
En esta entrada voy a recordar cómo se crea e inicia un servicio en Android cuando arrancamos el sistema. Lo dejo por si a alguien le sirve y me vendrá muy bien para que no se me olvide.
Un servicio es un proceso que se ejecuta en segundo plano y no necesita de una interfaz para hacerlo. Lo que pretendemos es que se ejecute al iniciar el sistema Android.
Cuando un sistema Android se inicia hace una llamada a un procedimiento "broadcast" que avisa a todos los demás procesos de que el sistema se ha iniciado: android.intent.action.BOOT_COMPLETED. Lo que hacemos es crear una clase que "escuche" esta llamada e inicie nuestro servicio. La clase que es capaz de escuchar estas llamadas broadcast es BroadcastReceiver. Por tanto, lo primero es crear una clase que extienda de la clase anterior:
public class IniciadorServicio extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Intent servicio = new Intent();
servicio.setAction("MiServicio");
context.startService(servicio);
}
}
Al método startService le pasamos el Intent servicio, que es el servicio que queremos ejecutar, cuyo nombre será MiServicio:
public class Servicio extends Service
{
private static final String TAG = "EjemploServicio";
private Timer timer;
@Override
public IBinder onBind(Intent intent)
{
return null;
}
@Override
public void onCreate()
{
super.onCreate();
Log.d(TAG, "El servicio se ha creado");
timer = new Timer();
}
@Override
public void onStart(final Intent intent, final int startId)
{
super.onStart(intent, startId);
timer.scheduleAtFixedRate(new TimerTask()
{
@Override
public void run()
{
Log.i(TAG, "Ejecutando la tarea del servicio");
}
}, 0, 30000);
}
}
Lo que hace nuestro servicio es sencillo, al crearse inicializamos un Timer para ejecutar una tarea cada cierto tiempo. Cuando comienza el servicio, en el método onStart configuramos el Timer creado indicando lo que debe hacer (en esta caso imprime en el log del emulador "Ejecutando la tarea del servicio") cada 30 segundos.
Finalmente, tenemos que configurar el manifiesto del servicio registrando el IniciadorServicio y el propio servicio MiServicio:
<manifest android:versioncode="1" android:versionname="1.0" package="foo.bar"
xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<service android:name=".MiServicio">
<intent-filter>
<action android:name="MiServicio">
</action></intent-filter>
</service>
<receiver android:name=".IniciadorServicio">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED">
</action></intent-filter>
</receiver>
</application>
<uses-sdk android:minsdkversion="3">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">
</uses-permission></uses-sdk></manifest>
Lo que hacemos en el manifiesto es registrar el servicio MiServicio y registrar el tipo de señal que espera nuestro IniciadorServicio para ejecutarse. También indicamos que nuestro servicio requiere permisos para conocer cuando se ha iniciado el sistema (linea 15).
Hola,
ResponderEliminaren primer lugar me ha servido de mucha ayuda tu post, pero faltaría algo para poder aplicarla al 100% en mi aplicación, a ver si me puedes ayudar..
Mi aplicación tiene un servicio ligado, realizo comunicación entre procesos, y tengo que mantenerme a la escucha de un servidor durante cualquier activity. Dado que los servicios de estas características deben estar siempre ligados a algún otro componente, ¿como podría aplicar el método de tu post a mi servicio? ¿Puede mi servicio ser bounded y unbounded al mismo tiempo (acceder a él mediante startService y bindService indistintamente)?
Un saludo y gracias
Buenas tardes,
ResponderEliminarantes de nada muchas gracias, me está ayudando mucho tu post. Sólo tengo una duda que plantearte:
- Este Service se inicia al arrancar el teléfono. Pero si el usuario acaba de instalar mi app, ¿como se inicia el Timer sin reiniciar el teléfono?
ese tambien es mi duda yo quiero q arranque mi servicio al iniciar mi app ya que el usuario no le gustara reiniciar su telefeno para que mi app funcione
ResponderEliminarEn la primera Activity que ejecute nuestra aplicación en el onCreate ejecutamos lo siguiente.
ResponderEliminarIntent service = new Intent(this, Servicio.class);
startService(service);
Muchas gracias por este post, me ha sido de mucha utilidad.
ResponderEliminarhola cuando reinicio el celular no se ejecuta mi servicio,cual puede ser el problema
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarNO se ve l ainformación que va en el manifest, por favor subir, muchas gracias
ResponderEliminar