Intentando iniciar un servicio al arrancar en Android
He estado intentando iniciar un servicio cuando se inicia un dispositivo con Android, pero no puedo hacerlo funcionar. He mirado varios enlaces en línea pero ninguno de los códigos funciona. ¿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");
}
}
Las otras respuestas parecen buenas, pero pensé en resumir todo en una respuesta completa.
Necesita lo siguiente en su AndroidManifest.xml
archivo:
En tu
<manifest>
elemento:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
En su
<application>
elemento (asegúrese de utilizar un nombre de clase completo [o relativo] para suBroadcastReceiver
):<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 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
<receiver>
elemento estaba en el<application>
elemento BroadcastReceiver
no está claro si se especificó el nombre de clase completo (o relativo) correcto para- 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. Entonces, si la aplicación se instala en un almacenamiento externo, no recibirá el mensaje de transmisión BOOT_COMPLETE.
Más detalles aquí en la sección Receptores de transmisión escuchando "arranque completado"
Cómo iniciar el servicio al iniciar el 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 nuevas de Android.
Solución:
Crear aplicación con actividad. Cuando el usuario la ejecuta una vez, la aplicación puede recibir el mensaje de transmisión BOOT_COMPLETE.
Para el 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 transmisión BOOT_COMPLETE.
En este caso hay dos soluciones:
- Instale su aplicación en el almacenamiento interno
- Instale otra pequeña aplicación en el almacenamiento interno. Esta aplicación recibe BOOT_COMPLETE y ejecuta una segunda aplicación en un almacenamiento externo.
Si su aplicación ya está instalada en el almacenamiento interno, el código a continuación puede ayudarlo a comprender cómo iniciar el servicio al iniciar el dispositivo.
En manifiesto.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, es posible que también necesite agregar este código en el Manifiesto si el dispositivo no detecta RECEIVE_BOOT_COMPLETED:
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
El receptor ahora se ve así:
<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 reiniciar el emulador o el 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? Obtenga una lista de dispositivos conectados con identificaciones:
adb devices
adb en ADT por defecto lo puedes encontrar en:
adt-installation-dir/sdk/platform-tools
¡Disfrutar! )
Junto con
<action android:name="android.intent.action.BOOT_COMPLETED" />
también uso,
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
Los dispositivos HTC no parecen detectar BOOT_COMPLETED