Intentando iniciar un servicio de inicio en Android

He estado intentando iniciar un servicio cuando un dispositivo arranca en android, pero no puedo hacerlo funcionar. He mirado en una serie de enlaces en línea, pero ninguno de los trabajos de código. ¿Me estoy olvidando de algo?

AndroidManifest.xml

<receiver android:name=".StartServiceAtBootReceiver" android:enabled="true" android:exported="false" android:label="StartServiceAtBootReceiver" > <intent-filter> <action android:name="android.intent.action._BOOT_COMPLETED" /> </intent-filter> </receiver> <service android:name="com.test.RunService" android:enabled="true" /> 

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"); } } 

Gracias

15 Solutions collect form web for “Intentando iniciar un servicio de inicio en Android”

Las otras respuestas se ven bien, pero pensé que me envolvería todo en una respuesta completa.

Necesita lo siguiente en su archivo AndroidManifest.xml :

  1. En el elemento <manifest> :

     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
  2. En el elemento <application> (asegúrese de usar un nombre de clase completo [o relativo] para su BroadcastReceiver ):

     <receiver android:name="com.example.MyBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> 

    (No necesita los atributos android:enabled , exported , etc.): los valores por defecto 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 <receiver> estaba en el elemento <application>
  • No está claro si se especificó el nombre de clase completamente calificado (o relativo) para BroadcastReceiver
  • Hubo un error tipográfico en el <intent-filter>

Como información adicional: BOOT_COMPLETE se envía a las aplicaciones antes de montar el almacenamiento externo. Así que si la aplicación está instalada en un almacenamiento externo, no recibirá BOOT_COMPLETE mensaje de difusión.

Más detalles aquí en la sección Receptores de radiodifusión que escuchan "boot completed"

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

Por primera vez: desde la versión Android 3.1 o posterior no recibes BOOT_COMPLETE si el usuario nunca inició tu aplicación al menos una vez o la aplicación "forzada por el usuario". Esto se hizo para evitar que el malware registre automáticamente el servicio. Este agujero de seguridad fue cerrado en versiones más recientes de Android.

Solución:

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

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

En este caso hay dos soluciones:

  1. Instala tu aplicación en el almacenamiento interno
  2. Instala otra pequeña aplicación 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 código siguiente le ayudará a entender cómo iniciar el servicio en el inicio del dispositivo.


En Manifest.xml

Permiso:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

Registre su receptor BOOT_COMPLETED:

 <receiver android:name="org.yourapp.OnBoot"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> 

Registre su servicio:

 <service android:name="org.yourapp.YourCoolService" /> 

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 tal vez necesite añadir también Manifieste este código si el dispositivo no captura RECEIVE_BOOT_COMPLETED:

 <action android:name="android.intent.action.QUICKBOOT_POWERON" /> 

El receptor ahora se parece a esto:

 <receiver android:name="org.yourapp.OnBoot"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> </intent-filter> </receiver> 

Cómo probar BOOT_COMPLETED sin emulador de reinicio 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 la lista de dispositivos conectados con id's:

 adb devices 

Adb en ADT por defecto se puede encontrar en:

 adt-installation-dir/sdk/platform-tools 

¡Disfrutar! )

Junto con

 <action android:name="android.intent.action.BOOT_COMPLETED" /> 

también utiliza,

 <action android:name="android.intent.action.QUICKBOOT_POWERON" /> 

Los dispositivos HTC no parecen atrapar BOOT_COMPLETED

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

<action android:name="android.intent.action._BOOT_COMPLETED"/>

en lugar de :

<action android:name="android.intent.action.BOOT_COMPLETED"/>

Un pequeño "_" y todo este problema 🙂

Descubrí ahora mismo que puede ser debido a la opción de Fast Boot en Settings > Power

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

Por cierto, tengo Android 2.3.3 en HTC Incredible S

Espero eso ayude.

Creo que tu manifiesto necesita agregar:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

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

 <receiver android:name="BootIntentReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.HOME" /> </intent-filter> </receiver> 

¿Ha intentado omitir la cláusula if "android.intent.action.BOOT_COMPLETED".equals(intent.getAction() , ya que el receptor probablemente sólo recibe 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 arranque en Service

Después de probar todas las respuestas y trucos mencionados, finalmente encuentro 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. 🙂

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

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" ... > 

Algunos dispositivos HTC pueden habilitar una función de "arranque rápido" que se parece más a una hibernación profunda y no a un reinicio real y, por lo tanto, no debe dar la intención BOOT_COMPLETE. Para recuperar esto puedes agregar este filtro intención dentro de tu receptor:

  <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> </intent-filter> 

Si estás usando Android Studio y estás muy encariñado con completar automáticamente, entonces debo informarte, estoy usando Android Studio v 1.1.0 y usé auto-complete para el siguiente permiso

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

Y Android Studio Auto-completado RECEIVE_BOOT_COMPLETED todo en minúsculas como receive_boot_completed y seguí tirando de mi pelo porque ya había marcado mi lista de verificación de cosas que hacer para iniciar el servicio de arranque. Acabo de confirmar de nuevo

Android Studio HACE auto-completar este permiso en minúsculas.

De hecho, me meto en este problema no hace mucho tiempo, y es realmente muy fácil de arreglar, en realidad no hacer nada mal si se configura el "android.intent.action.BOOT_COMPLETED" permiso y el intento de filtro.

Tenga en cuenta que si en Android 4.X, tiene que ejecutar el escuchador de difusión antes de iniciar el servicio en el arranque, es decir, hay que añadir una actividad primero, una vez que su receptor de radiodifusión en funcionamiento, la aplicación debe funcionar como esperaba, Sin embargo, en Android 4.X, no he encontrado una manera de iniciar el servicio en el arranque sin ninguna actividad, creo que Google hizo eso por razones de seguridad.

Como @Damian comentó, todas las respuestas en este hilo lo están haciendo mal. Hacerlo manualmente de esta manera corre el riesgo de que su servicio se interrumpa en el medio del dispositivo que va a dormir. Primero debe obtener un bloqueo de estela. 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); } } 

Entonces, en su servicio, asegúrese de liberar el bloqueo de la sesió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 olvide agregar el permiso de WAKE_LOCK a su mainfest:

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> 

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

  • Cómo recoger una llamada por adb
  • Java.io.IOException: SERVICE_NOT_AVAILABLE en el cliente de GCM
  • Servicio enlazado de Android, ¿qué sucede cuando la actividad no lo enlaza?
  • Android - el servicio se detiene cuando se destruye la actividad
  • ¿Cuándo debo usar unbindService (), y cómo debo usarlo correctamente para desvincularme de un servicio remoto que está utilizando una interfaz AIDL?
  • Servicio enlazado versus servicio iniciado en Android y cómo hacer ambas cosas
  • ¿Android mata cada servicio o el proceso entero?
  • Eliminar el botón flotante de WindowManager cuando se pulsa el botón de encendido
  • ¿Cómo mantener una conexión TCP establecida indefinidamente?
  • ¿Es posible tener Android Voice Recognition (como un servicio personalizado) en Google Glass?
  • Android: ¿Cómo ejecutar el servicio cuando la aplicación es visible?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.