A maioria das soluções postadas aqui está perdendo uma peça importante: fazer isso sem um wake lock corre o risco de seu serviço ser interrompido antes de terminar o processamento. Vi essa solução em outro tópico, respondendo aqui também.
Como WakefulBroadcastReceiver foi descontinuado no api 26, ele é recomendado para níveis de API abaixo de 26
Você precisa obter um wake lock. Felizmente, a biblioteca de suporte nos oferece uma classe para fazer isso:
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);
}
}
em seguida, em seu serviço, certifique-se de liberar o wake lock:
@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);
}
Não se esqueça de adicionar a permissão WAKE_LOCK e registrar seu receptor no manifesto:
<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()
em seu serviço. Caso contrário, o Android e seus usuários eliminarão seu serviço por considerá-lo uma perda de espaço e você receberá alguns comentários desagradáveis no Android Market. Na maioria das situações em que você pensa que deseja que um serviço seja iniciado no momento da inicialização, é melhor usá-AlarmManager
lo para que seu serviço possa ser executado periodicamente, em vez de continuamente .