Bienvenidos sean a este post, una buena posibilidad que nos provee el sistema es la posibilidad de poder iniciar una aplicacion nuestra como un servicio una vez finalizada la carga del S.O., esto sin la intervencion del usuario, un ejemplo de esto podria ser un servicio de mensajeria instantanea el cual debera estar siempre atento a la recepcion de mensajes.
Para poder lograrlo solamente debemos crear un receptor de anuncios que se active con el anuncio de android.intent.action.BOOT_COMPLETED, y desde aqui podremos crear el servicio, para entender el concepto veamos un ejemplo simple.
Primero deberiamos crear una clase que extendera a BroadcastReceiver:
public class ReceptorArranque extends BroadcastReceiver {
@Override
public void onReceive(Context contexto, Intent intento){
contexto.startService(new Intent(contexto, Servocio.class));
}
}
Como pueden ver en este codigo cuando se reciba el anuncio esta clase se encargara a la clase Servicio, la cual procederemos a detallar a continuacion:
public class Servicio extends Service {
@Override
public void onCreate(){
... Instrucciones ...
}
@Override
public int onStartCommand(Intent intento, int flags, int idArran){
... Instrucciones ...
}
@Override
public void onDestroy(){
... Instrucciones ...
}
@Override
public IBinder onBind(Intent intento){
return null;
}
}
Como pueden ver aca tendremos todas las acciones relacionadas a nuestra clase, ahora solamente nos falta conceder los permisos y definiremos el receptor en nuestro archivo AndroidManifest.xml, primero agregaremos los permisos para poder detectar el booteo completo:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Nuestra siguiente modificacion sera dentro del tag application donde agregaremos el siguiente bloque:
<application>
... Instrucciones ...
<receiver android:name="ReceptorArranque">
<intent-filter>
<action
android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
Con estas modificaciones basicas podremos hacer un servicio que cargue una actividad cuando el inicio este completo. Para entender mejor este concepto volvamos a abrir nuestro proyecto ServiciosMusica creada en este post, sino lo tienen les recomiendo hacerlo antes de seguir con esta modificacion.
Una vez abierta nuestra app, vamos a hacer un par de modificaciones en la misma la primera de ellas sera crear una nueva clase y para ello haremos click con el boton derecho sobre el contenedor de las clases Java y seleccionen New -> Java class, en el nuevo cuadro que aparece deben modificar unicamente el campo Name con el valor ReceptorArranque, el resto debe quedar como aparece y pulsen Ok para crear la nueva clase, una vez creada deberemos modificar la clase con el siguiente codigo:
package org.example.serviciosmsica;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class ReceptorArranque extends BroadcastReceiver {
@Override
public void onReceive(Context contexto, Intent intento){
contexto.startService(new Intent(contexto,ServicioMusica.class));
}
}
Este codigo se encarga de darle la posibilidad de poder recibir el anuncio de tipo broadcast, en este caso tendremos el metodo onReceive() el cual se encargara de recibir el anuncio y por medio de este le diremos que inicie una nueva actividad la cual sera iniciar a la clase ServicioMusica, nuestra siguiente modificacion sera sobre el archivo AndroidManifest.xml donde primero agregaremos los permisos que concederemos:
<uses-permission
android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Este permiso nos concedera la posibilidad de poder escuchar al anuncio de cuando el S.O informa cuando el inicio ha sido completado, nuestra siguiente modificacion sera un nuevo bloque dentro del bloque application:
<receiver android:name=".ReceptorArranque">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Este sera el encargado de recibir el anuncio de broadcast y en este caso le decimos que reciba cuando inicio ha sido completado, este se encargara de enviar la notificacion al programa y procedera a ejecutar lo solicitado, si lo compilamos y lo probamos no notaremos ninguna diferencia pero si reinician el telefono o el emulador ocurre lo que se ve en el siguiente video
El video es un poco largo pero lo hice asi para que vean como es el inicio de nuestro equipo ahora, se llama perfectamente a nuestra app ServiciosMusica, aunque el sonido sea pesimo, vemos tambien que la notificacion se creo correctamente teniendo un correcto funcionamiento de nuestro servicio, nuestro siguiente tema sera hablar sobre los anuncios de broadcast permanentes.
Nota: Les recomiendo desinstalar la app una vez terminado el ejemplo porque sino cada vez que abran el dispositivo, emulado o no, se ejecutara la musica de fondo y no es tan placentero.
Android nos permite dos tipos de broadcast: normales y permanentes. Este ultimo tipo de broadcast llegara a los receptores que actualmente esten escuchando pero a su vez lo que instancien en el futuro, un ejemplo de anuncio permanente es ACTION_BATTERY_CHANGED. Por ejemplo si nosotros usaramos a registerReceiver(), en lugar de AndroidManifest.xml, podemos obtener la intencion de la ultima emision de este anuncio, esto nos podria dar la posibilidad de conocer el estado de la bateria sin necesidad de esperar un futuro cambio en su estado, este tipo de anuncios tambien se conocen como persistentes o pegajoso por su nombre en ingles (sticky)
En resumen, hoy hemos visto como se puede permitir que una actividad se pueda usar al inicio de nuestro S.O, esto desde un Android menor a 6.0 para estos casos lo veremos mas adelante, hemos modificado una app de otro ejemplo para permitirnos ver como funciona, prometo dentro de poco comprar mas RAM para mostrar mejores mis ejemplos, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar
Es para mantenimiento del sitio, gracias!
$1.50
hola que tal Tinchicus
tu ejemplo por lo que veo lo realizaste con android menor a 6.0
Estoy con un proyecto donde tambien utilizo un Receiver para iniciar un servicio, pero en mi caso tengo como dispositivo de prueba con Android 7.0 y tengo otro con Android 8.0. En mis pruebas que he realizado funcionan perfectamente con android 8, pero no funciona para nada en android 7.0, Lo has probado con esta version?
Espero puedas ayudarme con esto.
Segun la documentacion indica que un receiver no funcionará en android 7 (API 24 ). dame tu opinion, y haber si puedes ayudarme con esto.
Gracias anticipadas.
Me gustaMe gusta
Hola, Cesar gracias por tu consulta, si estuve viendo que en varias secciones me quede muy desactualizado en algunos, por ejemplo Android y MySQL, y estoy en plena revision de muchos de mis posts mas viejos pero te prometo que lo proximo que voy a revisar es esto y bien tenga una novedad te lo comentare, nuevamente gracias por la visita y la idea es poder ayudar a la mayor cantidad de gente posible, te mando un abrazo enorme!
Me gustaMe gusta