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:
- Instala tu aplicación en el almacenamiento interno
- Instale otra aplicación pequeña en el almacenamiento interno. Esta aplicación recibe BOOT_COMPLETE y ejecuta la segunda aplicación en 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 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 Manifest este código si el dispositivo no atrapa 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 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? 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! )