Alla maggior parte delle soluzioni pubblicate qui manca un pezzo importante: farlo senza un wakelock rischia che il tuo servizio venga interrotto prima che sia terminata l'elaborazione. Ho visto questa soluzione in un altro thread, rispondendo anche qui.
Poiché WakefulBroadcastReceiver è deprecato in api 26, è consigliato per i livelli API inferiori a 26
È necessario ottenere un wakelock. Fortunatamente, la libreria di supporto ci offre una classe per farlo:
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);
}
}
quindi, nel tuo Servizio, assicurati di rilasciare il wakelock:
@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);
}
Non dimenticare di aggiungere l'autorizzazione WAKE_LOCK e di registrare il tuo ricevitore nel manifest:
<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()
nel tuo servizio. Altrimenti, Android ei suoi utenti elimineranno il tuo servizio come uno spreco di spazio e riceverai alcuni commenti spiacevoli nell'Android Market. Nella maggior parte delle situazioni in cui si pensa di voler avviare un servizio all'avvio, è meglio utilizzarlo inAlarmManager
modo che il servizio possa essere eseguito periodicamente anziché continuamente .