Intentando iniciar un servicio en el arranque en Android

He intentado iniciar un servicio cuando un dispositivo se inicia en Android, pero no puedo hacerlo funcionar. He visto una serie de enlaces en línea, pero ninguno de los códigos funciona. ¿Estoy olvidando algo?

AndroidManifest.xml

      

Receptor de radiodifusión

 public void onReceive(Context context, Intent intent) { if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) { Intent serviceLauncher = new Intent(context, RunService.class); context.startService(serviceLauncher); Log.v("TEST", "Service loaded at start"); } } 

Las otras respuestas se ven bien, pero pensé en resumir todo en una respuesta completa.

Necesitas lo siguiente en tu archivo AndroidManifest.xml :

  1. En su elemento :

      
  2. En su elemento (asegúrese de usar un nombre de clase completo [o relativo] para su BroadcastReceiver ):

          

    (no necesita los atributos android:enabled , exported , etc., los valores predeterminados de Android son correctos)

    En MyBroadcastReceiver.java :

     package com.example; public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent startServiceIntent = new Intent(context, MyService.class); context.startService(startServiceIntent); } } 

De la pregunta original:

  • no está claro si el elemento estaba en el elemento
  • no está claro si se especificó el nombre de clase completo calificado (o relativo) para BroadcastReceiver
  • hubo un error tipográfico en el

Como información adicional: BOOT_COMPLETE se envía a las aplicaciones antes de que se monte el almacenamiento externo. Por lo tanto, si la aplicación está instalada en el almacenamiento externo, no recibirá el mensaje de transmisión BOOT_COMPLETE.

Más detalles aquí en la sección Transmisores Receptores que escuchan “boot completed”

Cómo iniciar el servicio en el arranque del dispositivo (aplicación de ejecución automática, etc.)

Para empezar: desde la versión Android 3.1+, no recibirá BOOT_COMPLETE si el usuario nunca inició su aplicación al menos una vez o la aplicación de “fuerza cerrada” del usuario. Esto se hizo para evitar que el malware registre automáticamente el servicio. Este agujero de seguridad se cerró en las versiones más nuevas de Android.

Solución:

Crea una aplicación con actividad. Cuando el usuario lo ejecuta una vez que la aplicación puede recibir BOOT_COMPLETE mensaje de difusión.

Por segundo: BOOT_COMPLETE se envía antes de que se monte el almacenamiento externo. Si la aplicación está instalada en el almacenamiento externo, no recibirá el mensaje de transmisión BOOT_COMPLETE.

En este caso, hay dos soluciones:

  1. Instala tu aplicación en el almacenamiento interno
  2. Instale otra aplicación pequeña en el almacenamiento interno. Esta aplicación recibe BOOT_COMPLETE y ejecuta la segunda aplicación en el almacenamiento externo.

Si su aplicación ya está instalada en el almacenamiento interno, el siguiente código puede ayudarlo a comprender cómo iniciar el servicio en el arranque del dispositivo.


En Manifest.xml

Permiso:

  

Registra tu receptor BOOT_COMPLETED:

      

Registra tu servicio:

  

En el receptor OnBoot.java:

 public class OnBoot extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Create Intent Intent serviceIntent = new Intent(context, YourCoolService.class); // Start service context.startService(serviceIntent); } } 

Para HTC es posible que también necesite agregar Manifiesto este código si el dispositivo no detecta RECEIVE_BOOT_COMPLETED:

  

El receptor ahora se ve así:

       

¿Cómo probar BOOT_COMPLETED sin reiniciar emulador o dispositivo real? Es fácil. Prueba esto:

 adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED 

¿Cómo obtener la identificación del dispositivo? Obtener una lista de dispositivos conectados con id’s:

 adb devices 

adb en ADT por defecto puedes encontrarlo en:

 adt-installation-dir/sdk/platform-tools 

¡Disfrutar! )

Junto con

  

también uso,

  

Los dispositivos HTC parecen no detectar BOOT_COMPLETED

Tenga en cuenta que al comienzo de la pregunta, hay un error tipográfico:

en lugar de :

un pequeño “_” y todo este problema 🙂

Descubrí hace un momento que podría deberse a la opción de Fast Boot en Settings > Power

Cuando tengo esta opción desactivada, mi aplicación recibe esta transmisión, pero no de otra manera.

Por cierto, tengo Android 2.3.3 en HTC Incredible S

Espero eso ayude.

Creo que su manifiesto necesita agregar:

  

Después de probar todas las respuestas y trucos mencionados, finalmente descubro por qué el código no funciona en mi teléfono. Algunos teléfonos Android como “Huawei Honor 3C Android 4.2.2 ” tienen un menú de Statup Manager en su configuración y su aplicación debe estar marcada en la lista. 🙂

Tengo una etiqueta adicional, no sé si eso hace alguna diferencia.

       

¿Has probado omitir if-clause "android.intent.action.BOOT_COMPLETED".equals(intent.getAction() , ya que el receptor probablemente solo reciba esa intención de todos modos?

Consulte este enlace http://khurramitdeveloper.blogspot.in/2013/06/start-activity-or-service-on-boot.html Procedimiento paso a paso para usar el inicio en el servicio

Antes de montar el almacenamiento externo, se envía BOOT_COMPLETE. Si su aplicación está instalada en un almacenamiento externo, no recibirá el mensaje de transmisión BOOT_COMPLETE. Para evitar esto, puede instalar su aplicación en el almacenamiento interno. puedes hacer esto simplemente agregando esta línea en menifest.xml

  

Algunos dispositivos HTC pueden habilitar una característica de “inicio rápido” que se parece más a una hibernación profunda y no a un reinicio real y, por lo tanto, no debería dar el bash BOOT_COMPLETE. Para recuperar esto, puede agregar este filtro de intención dentro de su receptor:

      

Si está usando Android Studio y le gusta autocompletar, entonces debo informarle que estoy usando Android Studio v 1.1.0 y utilicé el autocompletado para el siguiente permiso

  

Y Android Studio Autocompletó RECEIVE_BOOT_COMPLETED todo en minúsculas como receive_boot_completed y seguí tirando de mi cabello porque ya había marcado mi lista de verificación para saber qué hacer para iniciar el servicio en el arranque. Acabo de confirmar de nuevo

Android Studio HACE autocompletar este permiso en minúsculas.

Como @Damian comentó, todas las respuestas en este hilo lo están haciendo mal. Hacerlo de forma manual como este corre el riesgo de que su Servicio se detenga en el medio desde que el dispositivo se apaga. Primero debe obtener un locking por activación. Afortunadamente, la biblioteca de soporte nos da una clase para hacer esto:

 public class SimpleWakefulReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // This is the Intent to deliver to our service. Intent service = new Intent(context, SimpleWakefulService.class); // Start the service, keeping the device awake while it is launching. Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime()); startWakefulService(context, service); } } 

luego, en su Servicio, asegúrese de liberar el locking de activación:

  @Override protected void onHandleIntent(Intent intent) { // At this point SimpleWakefulReceiver is still holding a wake lock // for us. We can do whatever we need to here and then tell it that // it can release the wakelock. ... Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime()); SimpleWakefulReceiver.completeWakefulIntent(intent); } 

No olvides agregar la permsión WAKE_LOCK a tu mainfest:

   

Esto es lo que hice

1. Hice la clase de receptor

 public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //whatever you want to do on boot Intent serviceIntent = new Intent(context, YourService.class); context.startService(serviceIntent); } } 

2. en el manifiesto

         ... 

3.y después de TODO lo que NECESITA para “configurar” el receptor en su MainActivity, puede estar dentro de la onCreate

 ... final ComponentName onBootReceiver = new ComponentName(getApplication().getPackageName(), BootReceiver.class.getName()); if(getPackageManager().getComponentEnabledSetting(onBootReceiver) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED) getPackageManager().setComponentEnabledSetting(onBootReceiver,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP); ... 

el último steap que aprendí de ApiDemos

De hecho, me metí en este problema no hace mucho, y es muy fácil de arreglar, en realidad no haces nada malo si configuras el permiso "android.intent.action.BOOT_COMPLETED" y el filtro de intención.

Tenga en cuenta que si utiliza Android 4.X, debe ejecutar el escucha de difusión antes de iniciar el servicio al arrancar, es decir, primero debe agregar una actividad; una vez que se ejecute su receptor de difusión, su aplicación debería funcionar como esperaba. sin embargo, en Android 4.X, no he encontrado una manera de iniciar el servicio al arrancar sin ninguna actividad, creo que Google lo hizo por razones de seguridad.

Me enfrenté a este problema si dejo el constructor vacío en la clase de receptor. Después de eliminar el contsructor vacío enRereceive methos comenzó a funcionar bien.