{"id":734,"date":"2013-05-26T23:47:06","date_gmt":"2013-05-27T05:47:06","guid":{"rendered":"http:\/\/www.lastdragon.net\/?p=734"},"modified":"2013-05-26T23:47:06","modified_gmt":"2013-05-27T05:47:06","slug":"service-boot-en-tu-aplicacion-de-android-o-aplicacion-de-auto-arranque","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=734","title":{"rendered":"Service Boot en tu aplicaci\u00f3n de Android o aplicaci\u00f3n de auto arranque"},"content":{"rendered":"<p>Seg\u00fan mi experiencia, es err\u00f3neo llamar servicio de arranque a una app que inicia sola cuando se carga Android. Creo que esta confusi\u00f3n viene de confundir estos m\u00e9todos de autoarranque con servicios en Windows o en GNU\/Linux.<\/p>\n<p>Si bien arranca  una parte de la aplicaci\u00f3n, esto no es un servicio, es solo una clase de la aplicaci\u00f3n, que en su interior puede contener c\u00f3digo para ejecutarse \u00bfQue es lo que ejecutara?, puede ser un llamado a un Actividad o realmente lanzar a partir de ah\u00ed un servicio de la aplicaci\u00f3n, como un subproceso (Servicio de App en Android? o hilo, pero el servicio lanzado ser\u00e1 consecuencia del c\u00f3digo ejecutado en la clase que se uso para arrancar dicho servicio, la clase en si no es un servicio. Si lo vemos fr\u00edamente, solo es una zona ( Clase )  que la hace de archivo de proceso por lotes un .BAT en Windows o un .SH en GNU\/Linux<\/p>\n<p>Sin embargo esta clase cumple con su prop\u00f3sito, se ejecuta al momento de que termina de cargar Android y por lo tanto a partir de ah\u00ed se puede iniciar rutinas que queremos que est\u00e9n funcionando todo el tiempo mientras el dispositivo este prendido.<\/p>\n<p>Entendiendo eso, queda claro que es muy sencillo arrancar un \u201cservicio de arranque\u201d  en Android. Lo \u00fanico que hace falta es crear una clase que herede de BroadcastReceiver, sobre escribir en la clase un m\u00e9todo llamado onReceive , poner todo el c\u00f3digo JAVA que queremos ejecutar en el m\u00e9todo onReceive. Por \u00faltimo decirle al manifiesto que clase queremos que se cargue cada que inicia Android. Se lee tan f\u00e1cil y el c\u00f3digo es f\u00e1cil.<\/p>\n<p>Por pasos.<\/p>\n<p>1 cre\u00e9 una soluci\u00f3n o proyecto en eclipse de Android, una simple actividad hello world<br \/>\n2 agregue un archivo de clase en el mismo paquete donde est\u00e1 el c\u00f3digo fuente de la clase de la actividad, para este ejemplo le llamare arrancainicio <\/p>\n<blockquote><p>import android.content.BroadcastReceiver;<br \/>\nimport android.content.Context;<br \/>\nimport android.content.Intent;<br \/>\nimport android.widget.Toast;<\/p>\n<p>public class arrancainicio extends BroadcastReceiver&nbsp; {<\/p>\n<p>&nbsp;&nbsp;&nbsp; @Override<br \/>\n&nbsp;&nbsp;&nbsp; public void onReceive(Context arg0, Intent arg1) {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <\/p>\n<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; \/\/ LANZAR un LETRERO<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Toast.makeText(arg0, &#8220;Codigo<br \/>\nejecutandose en la clase arrancainicio&#8221;, Toast.LENGTH_LONG).show();<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; \/\/ ARRANCA LA ACTIVIDAD ( ABRE<br \/>\nAUTOMATICAMENTE LA APP EN LA CLASE PRINCIPAL )<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Intent i = new Intent(arg0,<br \/>\nMainActivity.class); <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\ni.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arg0.startActivity(i); <\/p>\n<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; }<\/p>\n<p>}<\/p><\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lastdragon.net\/misarchivos\/androidboot\/ideautoarranque.jpg\" alt=\"Service Boot en tu aplicaci\u00f3n de Android\" width=\"425\" height=\"350\" \/><br \/>\n<a href=\"https:\/\/www.lastdragon.net\/misarchivos\/androidboot\/ideautoarranque.jpg\">Ver mas grande<\/a><\/p>\n<p>3 Agregue en el manifiesto la solicitud de permiso para saber cu\u00e1ndo ha terminado de cargar Android y que clase recibir\u00e1 el aviso, la clase debe ser la que se cre\u00f3 para este fin, en este caso arrancainicio.<\/p>\n<p>El manifiesto debe verse como esto.<\/p>\n<blockquote><p>\n&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;<br \/>\n&lt;manifest xmlns:android=&#8221;http:\/\/schemas.android.com\/apk\/res\/android&#8221;<br \/>\n&nbsp;&nbsp;&nbsp; package=&#8221;net.lastdragon.autoarranque&#8221;<br \/>\n&nbsp;&nbsp;&nbsp; android:versionCode=&#8221;1&#8243;<br \/>\n&nbsp;&nbsp;&nbsp; android:versionName=&#8221;1.0&#8243; &gt;<\/p>\n<p>&nbsp;&nbsp;&nbsp; &lt;uses-sdk<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:minSdkVersion=&#8221;8&#8243;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:targetSdkVersion=&#8221;8&#8243;<br \/>\n\/&gt;<br \/>\n&nbsp;&nbsp;&nbsp; &lt;uses-permission<br \/>\nandroid:name=&#8221;android.permission.RECEIVE_BOOT_COMPLETED&#8221; \/&gt;<\/p>\n<p>&nbsp;&nbsp;&nbsp; &lt;application<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android:allowBackup=&#8221;true&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nandroid:icon=&#8221;@drawable\/ic_launcher&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nandroid:label=&#8221;@string\/app_name&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nandroid:theme=&#8221;@style\/AppTheme&#8221; &gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;activity<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nandroid:name=&#8221;net.lastdragon.autoarranque.MainActivity&#8221;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nandroid:label=&#8221;@string\/app_name&#8221; &gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\n&lt;intent-filter&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\n&lt;action android:name=&#8221;android.intent.action.MAIN&#8221; \/&gt;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\n&lt;category android:name=&#8221;android.intent.category.LAUNCHER&#8221; \/&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\n&lt;\/intent-filter&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;\/activity&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;receiver<br \/>\nandroid:name=&#8221;.arrancainicio&#8221;&gt;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\n&lt;intent-filter&gt;<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<br \/>\n&nbsp; &nbsp;&nbsp; &lt;action<br \/>\nandroid:name=&#8221;android.intent.action.BOOT_COMPLETED&#8221;&gt; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &lt;category<br \/>\nandroid:name=&#8221;android.intent.category.HOME&#8221;&gt; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &lt;\/category&gt; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &lt;\/action&gt; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br \/>\n&lt;\/intent-filter&gt; <br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;\/receiver&gt; <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br \/>\n&nbsp;&nbsp;&nbsp; &lt;\/application&gt;<\/p>\n<p>&lt;\/manifest&gt;<\/p><\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lastdragon.net\/misarchivos\/androidboot\/autoarranque.png\" alt=\"Service Boot en tu aplicaci\u00f3n de Android\" width=\"425\" height=\"350\" \/><br \/>\n<a href=\"https:\/\/www.lastdragon.net\/misarchivos\/androidboot\/autoarranque.png\">Ver mas grande<\/a><\/p>\n<p>IMPORTANTE.<\/p>\n<p>Para que la aplicaci\u00f3n este lista para auto ejecutarse cada que encienda su dispositivo Android, la aplicaci\u00f3n debe ejecutarse al menos una vez llamada por el usuario dando tap sobre el icono de la aplicaci\u00f3n en el escritorio de Android, si no la arranca al menos una vez, nunca se ejecutara autom\u00e1ticamente.<\/p>\n<p>Si entendi\u00f3 lo anterior es obvio que acaba de deducir lo siguiente, ya que lo que se ejecuta es solo una clase de la APP, podr\u00eda no necesitar una actividad y una aplicaci\u00f3n sin actividad no crea su icono en el escritorio de Android, podr\u00eda 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\u00e1 arrancarla nunca y si no la arranca nunca voluntariamente, nunca arrancara autom\u00e1ticamente cuando inicie Android.<\/p>\n<p>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\u00eda simplemente ejecutar algo o poner el c\u00f3digo para lanzar un servicio en la aplicaci\u00f3n. <\/p>\n<p>Por ejemplo si omito el siguiente c\u00f3digo en arrancainicio que lanza la actividad principal <\/p>\n<blockquote><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Intent i = new Intent(arg0,<br \/>\nMainActivity.class); <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\ni.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); <br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arg0.startActivity(i); <\/p>\n<\/blockquote>\n<p>Lo \u00fanico que ocurrir\u00eda cuando carga el dispositivo Android ser\u00eda el mensaje del Toast<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seg\u00fan mi experiencia, es err\u00f3neo llamar servicio de arranque a una app que inicia sola cuando se carga Android. Creo que esta confusi\u00f3n viene de confundir estos m\u00e9todos de autoarranque con servicios en Windows o en GNU\/Linux. Si bien arranca una parte de la aplicaci\u00f3n, esto no es un servicio, es solo una clase de&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-734","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/734","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=734"}],"version-history":[{"count":0,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/734\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}