Iniciar servicio en android después del boot
Esta entrada, principalmente dedicada a mi mismo ya que se que se me va a olvidar cómo hacerlo, indica paso a paso como crear un servicio en Android que se ejecute al iniciar el sistema. Como sabemos, un servicio es un proceso que se ejecuta en background aun cuando ningún componente visual de nuestra aplicación se encuentre activo.
La idea es más o menos sencilla: una vez que un sistema Android ha iniciado envía una acción broadcast llamada android.intent.action.BOOT_COMPLETED. La idea es crear un BroadcastReceiver que escuche este tipo de acciones e inicie el servicio que deseemos. Así pues, el primer paso es crear una clase que extienda BroadcastReceiver:
public class Recibidor extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Intent servicio = new Intent();
servicio.setAction("foo.bar.Servicio");
context.startService(servicio);
}
}
Lo interesante aquí es que se ejecuta el método startService enviando como parámetro un Intent cuyo action es “foo.bar.Servicio”, el cual es el servicio que deseamos ejecutar. Dicho servicio es una clase que extiende de Service, y del cual debemos sobrescribir los métodos onCreate y onStart:
public class Servicio extends Service{
private static final String TAG = "EjemploServicioBoot";
private Timer timer;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate(){
super.onCreate();
Log.d(TAG, "Servicio 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, "Se ejecuta la tarea");
}
}, 0, 15000);
}
}
En este caso, el servicio realiza una tarea muy simple: imprime en el log del sistema un mensaje. Básicamente tenemos un objeto tipo Timer que ejecutará una tarea; en onCreate simplemente iniciamos el objeto Timer, mientras que en onStart usamos el método scheduleAtFixedRate indicando que ejecutaremos dicha tarea cada 15 segundos.
Por último, debemos registrar en el archivo AndroidManifest.xml el BroadcastReceiver y el servicio:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="foo.bar" android:versionCode="1" android:versionName="1.0">
<application>
<service android:name=".Servicio">
<intent-filter>
<action android:name="foo.bar.Servicio"/>
</intent-filter>
</service>
<receiver android:name=".Recibidor">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion="3" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
</manifest>
En el manifest podemos ver que añadimos un elemento service dentro de application, para registrar nuestro servicio. Y lo más interesante se ve en las líneas 12 y 17, que es donde indicamos el tipo de mensaje que nuestro recibidor estará esperando antes de ejecutar la tarea e indicamos que la aplicación requiere permisos para conocer cuando el boot del sistema a finalizado.
28 Comentarios | deja el tuyo





Gracias!
Estoy aprendiendo a cacharrear un poco con Android, y este código me va a venir muy bien
Excelente pagina, desde hoy sere un fiel seguidor, gracias por compartir tu informacion
Hola que tal, muy buenos tus artículos, pero queria hacerte una pregunta, no les pones categorias a tus entradas?, porque quiero ver todas las entradas de Android pero no encuentro la manera.
Saludos y suerte con el sitio.
Disculpa por el mensaje anterior, lo que pasa es que yo intentaba con ./categoria/android, y lo correcto es ./category/android
Como inicio una class dentro del servicio?
Class? Supongo que te refieres a una clase. Y si es así, las clases no se inician. Tal vez quieras instanciarla o usar sus métodos estáticos, pero eso de iniciarla no existe.
Saludos.
Perdon, me referia a una vez iniciado el servicio como puedo con intent llamar a otra clase, o sea, qiero crear un servicio para q arranque con el boot automaticamente y luego q ejecute un class con un envio de sms cada 30 minutos con una foto capturada de la camara, se hacer q capture la camara y envie el sms pero no se añadirlo al servicio. gracias.
Entiendo… en ese caso te recomiendo que:
1. Crees un Broadcast receiver que se ejecute cada vez que se inicia el sistema (supongo que esta parte ya la tienes)
2. En el broadcast, en vez de iniciar un servicio, utilices el AlarmManager, el cual te va a permitir realizar este tipo de tareas repetitivas, sin consumir demasiados recursos y con una mayor presición de tiempo.
Saludos!
Gracias! lo intentare y mañana te digo algo.
Por otra parte, tengo creado un widget, 2 cuestiones: sabes como bloquear el qidget y q no se pueda eliminar del escritorio? – sabes como hacer para que pueda presentar un mapa de google?
Ninguna de las dos es posible, al menos en un Android normal. La cosa es:
1. El usuario debe tener el derecho de borrar y agregar widgets cuando quiera, sería intrusivo y de mal gusto que no se pudiera. (apuesto que tienes una buena razón para dejar el widget fijo, pero no es posible hacerlo).
2. Los widgets no pueden mostrar views avanzados… solo textviews, image view (este podría ser tu salvación, si haces un bitmap apartir de un mapa y se lo asignas; aún así, no va a poder ser interactivo) y un par de layout containers.
A menos que vos mismo hagas cambios en el código fuente de Android, y compiles un nuevo ROM, estas cosas que quieres no son posibles.
Un saludo.
Hola, la cuestion es he visto que hay un widget que si tiene un mapa puesto, y creo q es en flash, crees q es posible así? como podria presentar el flash?
por otra parte el tema de q el widget este fijo me gustaria poder hacerlo, d q otra manera puedo ejecutar con el boot una apk y q este residente en servicio y no se presente ni en widget ni en pantalla pero si q este funcionando?
Umm… interesante… ¿qué aplicación tiene el widget del que estás hablando? Dame el id de la app para echarle un vistazo… tal vez podamos decifrar con qué está hecho. De momento, sigo pensando que no se puede… y menos un flash.
Saludos!
http://www.appbrain.com/app/where-i-am-widget/drowning.zebra.wiamwidget
ok, exale un vistazo. yo tengo varias aplicaciones en el market publicadas, si qieres podemos conversar por otro medio q no sea este blog. dime
Uff, eso de “que no sea este blog” me dolió. En fin… acabo de mirar la app, y no es un flash, de hecho, el widget no es animado ni muy interactivo. Apuesto mi ropa interior a que es una ImageView… desafortunadamente no tengo ningún emulador con el android market instalado y el movil que tengo no está rooteado así que no puedo ver en detalle que usan en ese widget… pero no creo que sea flash.
Un saludo!
Pedir disculpas ante todo.
Nada mas alla de mi intencion de no segir escribiendo aqui…
Creo que hace una captura de URL y la almacena como bitmap cada vez q refresca la posición…
Exacto… es lo que creo que hace. Como mencioné hace un rato, el API de los widgets de Android es muy restrictiva en cuanto qué Views se puede poner.
Hola,
Estoy intentando realizar una aplicacion y tiene que comprobar la fecha de sistema, como debe hacerlo todos los dias. Habia pensado usar este metodo. Lo que no me queda claro de este codigo es que logicamente tienes que meterlo en una aplicacion, ¿si no abres esa aplicacion no correria el servicio al iniciar el android no?
Gracias y enhorabuena por tus tutoriales,
Saludos,
El método expuesto acá no requiere que se ejecute la aplicación. Sin embargo, creo que no funcionaría para tu caso. El método aquí expuesto es para ejecutar un servicio en el momento del boot, es decir cuando se enciende el teléfono móvil.
Lo que te recomiendo es que hagas uso del AlarmManager.
Saludos.
gracias por la respuesta!.
Entonces instalas la apk y sirve para meter un servicio en el arranque de la maquina?
Y si yo quiero una aplicacion, por ejemplo que haga una serie de cosas pero ademas que meta en el arranque de la maquina un servicio tambien? Como tendria que hacer? Con ejecutar la aplicacion la primera vez valdría o tendria que ejecutarla cada vez que reiniciara?
Saludos,
>> Y si yo quiero una aplicacion, por ejemplo que haga una serie de cosas pero ademas que meta en el arranque de la maquina un servicio tambien?
Eso es precisamente lo que se explica en el tutorial XD
>> Con ejecutar la aplicacion la primera vez valdría o tendria que ejecutarla cada vez que reiniciara?
Con la primera vez que se ejecute la aplicacion ya basta… de resto ya no toca estarla ejecutando… por eso dice: “que este método sirve para ejecutar algo AUTOMÁTICAMENTE en el arranque”… automático significa que no es manual… o sea que no hay que iniciar nada al reiniciar el sistema.
Un saludo.
Gracias,
Lo que pasa es que no comprendo como al ejecutar por primera la aplicacion ya funciona para cada vez que reinicias, ya que si cierro la aplicacion y el proceso no se encuentra en memoria no entiendo como al reiniciar el telefono puede otra vez llamar a ese servicio. Me supongo porque tendra que escribir algon en algun lado en el arranque del telefono.
Ahh, ya entiendo tu duda… lo recomendado es que leas y sigas todo el tutorial.
Lo de que cada vez que se incia se ejecute tu servicio funciona por lo siguiente: cuando android está arrancando envía un mensaje llamado “android.intent.action.BOOT_COMPLETED”. Todas las aplicaciones que tengan registrado un “escuchador” de ese tipo de mensajes serán informados cuando android arranque. Por lo tanto, en ese momento tú haces lo que debas hacer (iniciar un servicio, por ejemplo).
Saludos.
Gracias de nuevo.
Es que por la arquitectura, yo creia que al arrancar no habia aplicaciones abiertas y por tanto esa escucha no la podian hacer las aplicaciones, pero por lo que me comentas las aplicaciones deben estar implementadas que al arrancar puedan escuchar sin que haga falta que hayan sido ejecutadas.
Saludos
Simplemente GRACIAS!
Yo necesito hacer una aplicación, que constantemente verifique si el usuario tiene mensajes nuevos en una base de datos externa y si encuentra un mensaje nuevo me envíe una notificación.
Es decir por ejemplo que el programa se conecte a la base de datos remota cada 15 minuto, verifique si hay información nueva y si la hay muestre una notificación al usuario sobre la existencia de la misma..
Muchas gracias por su colaboración
Que tal Henry, ya has encontrado como hacerlo? Lo que pasa es que yo tambien necesito hacer lo que tu intentas hacer. Ya encontraste como hacerlo?
Gracias por tu aporte.! Sabes si el servicio de localización de googleMaps se puede llamar desde alguna aplicación.