Service Boot en tu aplicación de Android o aplicación de auto arranque
By: Date: mayo 26, 2013 Categories: Programación

Según mi experiencia, es erróneo llamar servicio de arranque a una app que inicia sola cuando se carga Android. Creo que esta confusión viene de confundir estos métodos de autoarranque con servicios en Windows o en GNU/Linux.

Si bien arranca una parte de la aplicación, esto no es un servicio, es solo una clase de la aplicación, que en su interior puede contener código para ejecutarse ¿Que es lo que ejecutara?, puede ser un llamado a un Actividad o realmente lanzar a partir de ahí un servicio de la aplicación, como un subproceso (Servicio de App en Android? o hilo, pero el servicio lanzado será consecuencia del código ejecutado en la clase que se uso para arrancar dicho servicio, la clase en si no es un servicio. Si lo vemos fríamente, solo es una zona ( Clase ) que la hace de archivo de proceso por lotes un .BAT en Windows o un .SH en GNU/Linux

Sin embargo esta clase cumple con su propósito, se ejecuta al momento de que termina de cargar Android y por lo tanto a partir de ahí se puede iniciar rutinas que queremos que estén funcionando todo el tiempo mientras el dispositivo este prendido.

Entendiendo eso, queda claro que es muy sencillo arrancar un “servicio de arranque” en Android. Lo único que hace falta es crear una clase que herede de BroadcastReceiver, sobre escribir en la clase un método llamado onReceive , poner todo el código JAVA que queremos ejecutar en el método onReceive. Por último decirle al manifiesto que clase queremos que se cargue cada que inicia Android. Se lee tan fácil y el código es fácil.

Por pasos.

1 creé una solución o proyecto en eclipse de Android, una simple actividad hello world
2 agregue un archivo de clase en el mismo paquete donde está el código fuente de la clase de la actividad, para este ejemplo le llamare arrancainicio

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class arrancainicio extends BroadcastReceiver  {

    @Override
    public void onReceive(Context arg0, Intent arg1) {
       
       

           // LANZAR un LETRERO
        Toast.makeText(arg0, “Codigo
ejecutandose en la clase arrancainicio”, Toast.LENGTH_LONG).show();
       
        // ARRANCA LA ACTIVIDAD ( ABRE
AUTOMATICAMENTE LA APP EN LA CLASE PRINCIPAL )
        Intent i = new Intent(arg0,
MainActivity.class);
       
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        arg0.startActivity(i);

       
    }

}

Service Boot en tu aplicación de Android
Ver mas grande

3 Agregue en el manifiesto la solicitud de permiso para saber cuándo ha terminado de cargar Android y que clase recibirá el aviso, la clase debe ser la que se creó para este fin, en este caso arrancainicio.

El manifiesto debe verse como esto.

<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
    package=”net.lastdragon.autoarranque”
    android:versionCode=”1″
    android:versionName=”1.0″ >

    <uses-sdk
        android:minSdkVersion=”8″
        android:targetSdkVersion=”8″
/>
    <uses-permission
android:name=”android.permission.RECEIVE_BOOT_COMPLETED” />

    <application
        android:allowBackup=”true”
       
android:icon=”@drawable/ic_launcher”
       
android:label=”@string/app_name”
       
android:theme=”@style/AppTheme” >
        <activity
           
android:name=”net.lastdragon.autoarranque.MainActivity”
           
android:label=”@string/app_name” >
           
<intent-filter>
               
<action android:name=”android.intent.action.MAIN” />

               
<category android:name=”android.intent.category.LAUNCHER” />
           
</intent-filter>
        </activity>
       
        <receiver
android:name=”.arrancainicio”>
          
<intent-filter>
              
     <action
android:name=”android.intent.action.BOOT_COMPLETED”>
             
          <category
android:name=”android.intent.category.HOME”>
           
            </category>
           
        </action>
           
</intent-filter>
        </receiver>
       
    </application>

</manifest>

Service Boot en tu aplicación de Android
Ver mas grande

IMPORTANTE.

Para que la aplicación este lista para auto ejecutarse cada que encienda su dispositivo Android, la aplicación debe ejecutarse al menos una vez llamada por el usuario dando tap sobre el icono de la aplicación en el escritorio de Android, si no la arranca al menos una vez, nunca se ejecutara automáticamente.

Si entendió lo anterior es obvio que acaba de deducir lo siguiente, ya que lo que se ejecuta es solo una clase de la APP, podría no necesitar una actividad y una aplicación sin actividad no crea su icono en el escritorio de Android, podría estar totalmente oculta a primera vista. Supongo que por este motivo y por razones de seguridad, obligan a ejecutarla al menos una vez por voluntad propia. Una APP sin Actividad principal puede compilar e instalarse, pero al no poner su icono en el escritorio no podrá arrancarla nunca y si no la arranca nunca voluntariamente, nunca arrancara automáticamente cuando inicie Android.

Note que aunque es necesario tener una actividad principal, cuando termina de cargar Android y llama a arrancainicio no es obligatorio llamar a ninguna actividad en este punto. Podría simplemente ejecutar algo o poner el código para lanzar un servicio en la aplicación.

Por ejemplo si omito el siguiente código en arrancainicio que lanza la actividad principal

        Intent i = new Intent(arg0,
MainActivity.class);
       
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        arg0.startActivity(i);

Lo único que ocurriría cuando carga el dispositivo Android sería el mensaje del Toast

7 thoughts on “Service Boot en tu aplicación de Android o aplicación de auto arranque

  1. Google Chrome 26.0.1410.64 Windows 7

    Que tal LD, bueno me acabo de chutar tu articulo, el cual esta incompleto, te comento por que, lo que hiciste es solo parte de crear un servicio en android, digamos que hiciste la mitad, el código solo hace que se autoejecute en el boot, creo que por eso tu confusión si lo que hiciste es un servicio o solo una app.

    Primero, un servicio en android se auto ejecuta en el boot, se mantiene ejecutandose en background, y no llama a una activity (aunque puedes hacerlo), ni necesita intervension del usuario para ejecutarse la primera vez, y puede o no tener icono, si no tiene icono se mostrara el droid por default, esto se ve en la lista de procesos en ejecución.

    Que te falta?
    MANIFEST:

    definir como tal el servicio, y el receptor

    permisos:

    En el Receiver

    Receiver extends BroadcastReceiver

    no llames una Activity llama al servicio como tal en el metodo:
    void onReceive(Context context, Intent intent) {

    context.startService(new Intent(context,AlgoService.class));

    Y ya en el servicio seria algo asi:

    public class AlgoService extends Service{

    la logica en alguno de sus metodos que necesites.

    con esto solo generas la aplicacion la mandas al dispositivo y el servicio se ejecuta, se mantiene y lo puedes ver en la lista de procesos.

    saludos.

    1. Google Chrome 55.0.2883.87 Windows NT

      Jakoff, me puedes ayudar en Algo referente a una aplicacion que quiero desarrollar, en realidad soy nuevo en JAVA y Android, y se que lo que quiero hacer no es dificil, pero hay muchas cosas que no entiendo.

      Por ejemplo.

      Quiero hacer una APP. que
      1.- Se ejecute en el Boot
      2.- Siempre este ejecuandose entre Domingo y Jueves de 7am, a 2pm
      3.- Cada 10 Minutos chequee cierta informacion y me actualize una DB externa

  2. Mozilla Firefox 21.0 Ubuntu Linux

    Lo que prentendia con el articulo es separar la clase del auto arranque. separar de una clase de servicio o de una actividad, esas 3 cosas son cosas totalmente diferentes y normalmente todos los autores de artículos lo manejan como un mismo concepto, cuando en realidad son cosas totalmente separadas, un servicio y una clase que auto arranca, ambas si se programan juntas se puede confundir como un servicio de android de arranque, pero no lo son.

    en mi segundo parrafo puse.

    Si bien arranca una parte de la aplicación, esto no es un servicio, es solo una clase de la aplicación, que en su interior puede contener código para ejecutarse ¿Que es lo que ejecutara?, puede ser un llamado a un Actividad o realmente lanzar a partir de ahí un servicio de la aplicación,

    Esa es la primera intensión, hacer la separación, un servicio es una clase que se ejecutara en background, esta puede ser lanzada desde una actividad o desde la clase que se ejecuta en el arranque.

    Voy a volver a hacer el laboratorio de el auto arranque, en todos los escenarios que probé. nunca arranco por si solo si no lo hacia correr yo mismo al menos una vez. después si se ejecutaba por si solo, Volveré a hacer la prueba.

  3. Google Chrome 26.0.1410.64 Windows 7

    ok ya entiendo mejor el objetivo del articulo, bueno para el ultimo párrafo de tu respuesta es por que la clase debe heredar de service y debes usar startService del context.

    saludos.

  4. Mozilla Firefox 24.0 Windows 7

    Hola, quiero saber si en el servicio se puede acceder a una BD en Sql Lite… ya que he realizado el servicio para que se inicie cuando se prende la tablet y funciona, ya que me envía un cartelito por pantalla, pero cuando llamo a una funcion que accede a la BD, se cierra la aplicación y no tengo un log en tablet, por lo que tampoco puedo ver cuál es el problema. Bueno, espero me puedas ayudar. Gracias.

  5. Mozilla Firefox 27.0 Windows NT

    Saludos.

    Tengo en mente crear un aplicación que me permita guardar un PIN, la aplicación se debe cargar antes que aparezca cualquier otra pantalla en el dispositivo al momento en que este se encienda, si se digita el PIN correctamente debería proceder el encendido normal. Si la contraseña (PIN) no se digita correctamente, entonces que el dispositivo no complete su encendido y que permanezca en espera hasta que se digite el PIN correcto.
    La pregunta es ¿Podrán los conceptos abordados en este ejemplo permitirme crear mi aplcación? ¿Qué otros podría necesitar?

    De antemano agradezco tomarse el tiempo en leer mi idea, y estaré encantado de recibir respuestas a mí interrogante.

    Saludos.

  6. Google Chrome 37.0.2062.103 Windows XP

    Buenos días…

    leyendo leyendo, me surge una pregunta… En vez de arrancar la aplicación según acabe de iniciar Android, ¿podría mi propia aplicación iniciar Android?…me explico

    Sería algo así como lo que hace un despertador… cuando le llega la hora… enciende el terminal (presuponemos que está totalmente apagado, no en standby) y se pone a sonar…

    O lo que es lo mismo… ¿puede una aplicación desarrollada por mí ejecutar alguna acción (boot on) si el terminal está apagado?

    No sé si alguien se lo ha planteado, pero por ejemplo si nos piden programar una aplicación-despertador, si no podemos implementar esa acción estaría muy muy incompleto, ya que el despertador debe sonar sí o sí aunque esté apagado (no en standby) el terminal.

    Si alguien sabe responder estas preguntas que planteo, por favor, no dudes en dejar alguna “pista” de cómo poder hacerlo… he trasteado muy mucho por google y no he encontrado nada.

    Saludos y gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada.