He estado intentando iniciar un servicio cuando un dispositivo se inicia en Android, pero no puedo hacer que funcione. He visto varios enlaces en línea, pero ninguno de los códigos funciona. ¿Estoy olvidando 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");
}
}
Respuestas:
Las otras respuestas se ven bien, pero pensé que resumiría todo en una respuesta completa.
Necesita lo siguiente en su
AndroidManifest.xml
archivo:En tu
<manifest>
elemento:En su
<application>
elemento (asegúrese de utilizar un nombre de clase totalmente calificado [o relativo] para suBroadcastReceiver
):(no es necesario el
android:enabled
,exported
, etc., atributos: los valores por defecto de Android son correctos)En
MyBroadcastReceiver.java
:De la pregunta original:
<receiver>
elemento estaba en el<application>
elementoBroadcastReceiver
se especificó el nombre de clase correcto completo (o relativo) para<intent-filter>
fuente
Como información adicional: BOOT_COMPLETE se envía a las aplicaciones antes de montar el almacenamiento externo. Entonces, si la aplicación está instalada en el almacenamiento externo, no recibirá el mensaje de difusión BOOT_COMPLETE.
Más detalles aquí en la sección Receptores de difusión que escuchan "arranque completado"
fuente
Cómo iniciar el servicio en el arranque del dispositivo (aplicación de ejecución automática, etc.)
Primero: desde la versión Android 3.1+ no recibe BOOT_COMPLETE si el usuario nunca inició su aplicación al menos una vez o si el usuario "forzó el cierre" de la aplicación. Esto se hizo para evitar que el malware registre automáticamente el servicio. Este agujero de seguridad se cerró en las versiones más recientes de Android.
Solución:
Crear aplicación con actividad. Cuando el usuario lo ejecuta una vez, la aplicación puede recibir un mensaje de difusión BOOT_COMPLETE.
Para el 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 difusión BOOT_COMPLETE.
En este caso hay dos soluciones:
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 Manifiesto.xml
Permiso:
Registre su receptor BOOT_COMPLETED:
Registre su servicio:
En el receptor OnBoot.java:
Para HTC, es posible que también necesite agregar Manifest este código si el dispositivo no atrapa RECEIVE_BOOT_COMPLETED:
El receptor ahora se ve así:
¿Cómo probar BOOT_COMPLETED sin emulador de reinicio o dispositivo real? Es fácil. Prueba esto:
¿Cómo obtener la identificación del dispositivo? Obtenga una lista de dispositivos conectados con identificaciones:
adb en ADT por defecto lo puedes encontrar en:
¡Disfrutar! )
fuente
Junto con
también use,
Los dispositivos HTC no parecen atrapar BOOT_COMPLETED
fuente
android.intent.action.QUICKBOOT_POWERON
solo se envía al restaurar desde el arranque rápido. Esto significa que no es necesario hacer cosas como restablecer las alarmas cuando se recupera de Fast Boot, ya que se conservan. Por lo tanto, solo sería necesario usarlo<action android:name="android.intent.action.QUICKBOOT_POWERON" />
si desea hacer algo cuando el usuario cree que el dispositivo se ha iniciado.Tenga en cuenta que al comienzo de la pregunta, hay un error tipográfico:
<action android:name="android.intent.action._BOOT_COMPLETED"/>
en vez de :
<action android:name="android.intent.action.BOOT_COMPLETED"/>
un pequeño "_" y todos estos problemas :)
fuente
Descubrí hace un momento que podría deberse a la
Fast Boot
opción enSettings
>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
enHTC Incredible S
.Espero eso ayude.
fuente
Creo que su manifiesto necesita agregar:
fuente
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. :)
fuente
Tengo una
<category>
etiqueta adicional , no sé si eso hace alguna diferencia.¿Has intentado omitir la cláusula if
"android.intent.action.BOOT_COMPLETED".equals(intent.getAction()
, ya que el receptor probablemente solo recibe esa intención de todos modos?fuente
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 el Servicio
fuente
Antes de montar el almacenamiento externo, BOOT_COMPLETE se envía a ejecutar. Si su aplicación está instalada en el almacenamiento externo, no recibirá el mensaje de difusión BOOT_COMPLETE. Para evitar esto, puede instalar su aplicación en el almacenamiento interno. puede hacer esto simplemente agregando esta línea en menifest.xml
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, puede agregar este filtro de intención dentro de su receptor:
fuente
Esto es lo que hice
1. Hice la clase de receptor
2.en el manifiesto
3. y después de TODO LO QUE NECESITA "configurar" el receptor en su MainActivity, puede estar dentro de onCreate
el último paso que aprendí de ApiDemos
fuente
Si está utilizando Android Studio y le gusta mucho el autocompletado, debo informarle que estoy usando Android Studio v 1.1.0 y usé el autocompletado para el siguiente permiso
Y Android Studio Auto completó
RECEIVE_BOOT_COMPLETED
todo en minúsculasreceive_boot_completed
y seguí arrancándome el pelo porque ya había marcado mi lista de verificación para saber qué hacer para comenzar el servicio en el arranque. Acabo de confirmar de nuevofuente
Como comentó @Damian, todas las respuestas en este hilo lo están haciendo mal. Hacerlo manualmente de esta manera corre el riesgo de que su Servicio se detenga en el medio del dispositivo que se va a dormir. Primero debe obtener un bloqueo de activación. Afortunadamente, la biblioteca de soporte nos da una clase para hacer esto:
luego, en su Servicio, asegúrese de liberar el bloqueo de activación:
No olvides agregar la permiso WAKE_LOCK a tu fiesta principal:
fuente
onNewIntent()
? O bien, puede consultar la fuente de IntentService y ver qué necesita hacer para que su Servicio coincida ...De hecho, me metí en este problema no hace mucho, y es realmente muy fácil de solucionar, en realidad no haces nada malo si configuras el
"android.intent.action.BOOT_COMPLETED"
permiso y el filtro de intención.Tenga en cuenta que si en Android 4.X, debe ejecutar el escucha de transmisión antes de comenzar el servicio en el arranque, eso significa que primero debe agregar una actividad, una vez que su receptor de transmisión se esté ejecutando, su aplicación debería 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 lo hizo por razones de seguridad.
fuente
Me enfrenté a este problema si dejo el constructor vacío en la clase de receptor. Después de quitar el contsructor vacío en Metodos de recepción comenzó a funcionar bien.
fuente