A la mayoría de las soluciones publicadas aquí les falta una pieza importante: hacerlo sin un bloqueo de activación corre el riesgo de que su Servicio se elimine antes de que termine de procesarse. Vi esta solución en otro hilo, respondiendo aquí también.
Dado que WakefulBroadcastReceiver está obsoleto en api 26, se recomienda para niveles de API inferiores a 26
Necesita obtener un bloqueo de activación. Afortunadamente, la biblioteca de soporte nos da una clase para hacer esto:
public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// This is the Intent to deliver to our service.
Intent service = new Intent(context, SimpleWakefulService.class);
// Start the service, keeping the device awake while it is launching.
Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
startWakefulService(context, service);
}
}
luego, en su Servicio, asegúrese de liberar el bloqueo de activación:
@Override
protected void onHandleIntent(Intent intent) {
// At this point SimpleWakefulReceiver is still holding a wake lock
// for us. We can do whatever we need to here and then tell it that
// it can release the wakelock.
...
Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime());
SimpleWakefulReceiver.completeWakefulIntent(intent);
}
No olvide agregar el permiso WAKE_LOCK y registrar su receptor en el manifiesto:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
...
<service android:name=".SimpleWakefulReceiver">
<intent-filter>
<action android:name="com.example.SimpleWakefulReceiver"/>
</intent-filter>
</service>
startForeground()
en su servicio. De lo contrario, Android y sus usuarios eliminarán su servicio por ser una pérdida de espacio y obtendrá algunos comentarios desagradables en Android Market. En la mayoría de las situaciones en las que cree que desea que un servicio se inicie en el momento del arranque, es mejor utilizarloAlarmManager
para que su servicio pueda ejecutarse periódicamente en lugar de de forma continua .