Intentando iniciar un servicio al arrancar en Android

Resuelto Alex asked hace 54 años • 0 respuestas

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");
    }
}
Alex avatar Jan 01 '70 08:01 Alex
Aceptado

Las otras respuestas parecen buenas, pero pensé en resumir todo en una respuesta completa.

Necesita lo siguiente en su AndroidManifest.xmlarchivo:

  1. En tu <manifest>elemento:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
  2. En su <application>elemento (asegúrese de utilizar 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 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
  • BroadcastReceiverno está claro si se especificó el nombre de clase completo (o relativo) correcto para
  • hubo un error tipográfico en el<intent-filter>
Timo Bruck avatar Mar 25 '2011 23:03 Timo Bruck

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"

inazaruk avatar Nov 22 '2010 13:11 inazaruk

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:

  1. Instale su aplicación en el almacenamiento interno
  2. 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! )

user3439968 avatar Sep 24 '2014 21:09 user3439968

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

Tony avatar May 14 '2013 11:05 Tony