Iniciar un servicio Android después del Boot


Si tu app de Android requiere la ejecución de un servicio para su funcionamiento, seguramente te interesará que el servicio se inicie en cuanto se encienda el teléfono. Esto es bastante sencillo de conseguir. Tan sólo hay que estar a la escucha del evento de Android que se lanza cuando se ha realizado el boot del sistema.


Para ello hay que registrar un receptor o BroadcastReceiver al evento del sistema android.intent.action.BOOT_COMPLETED. Esto se hace en el AndroidManifest.xml:
   
<receiver android:name=".MyBootReceiver" >
     <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED" />
     </intent-filter>
</receiver>

Y añadimos también el permiso correspondiente:
   
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">

Ahora implementamos la clase receptora, que iniciará el servicio en el método onReceive():
  
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
 
public class MyBootReceiver extends BroadcastReceiver {
 
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent service = new Intent(context, MyService.class);
        context.startService(service);
    }
}

IMPORTANTE:  si tu aplicación se instala en la memoria SD, NO recibirá el evento android.intent.action.BOOT_COMPLETED, como se explica en la documentación oficial. En este caso, como también explica la documentación, podéis registrar la app para recibir el evento android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE, que se envía una vez se haya montado la SD del dispositivo. Esto último parece que no funciona, como muchos desarrolladores han notificado en stackoverflow. ¿A alguien le funciona?