La plupart des solutions publiées ici manquent un élément important: le faire sans verrou de réveil risque de voir votre service être tué avant la fin du traitement. J'ai vu cette solution dans un autre fil, en répondant ici également.
Étant donné que WakefulBroadcastReceiver est obsolète dans l'api 26, il est recommandé pour les niveaux d'API inférieurs à 26
Vous devez obtenir un verrou de réveil. Heureusement, la bibliothèque de support nous donne une classe pour faire ceci:
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);
}
}
puis, dans votre service, assurez-vous de libérer le verrou de réveil:
@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'oubliez pas d'ajouter l'autorisation WAKE_LOCK et d'enregistrer votre récepteur dans le manifeste:
<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()
dans votre service. Sinon, Android et ses utilisateurs tueront votre service comme un gaspillage d'espace et vous obtiendrez des commentaires désagréables sur l'Android Market. La plupart des situations où vous pensez que vous souhaitez qu'un service démarre au moment du démarrage, il est préférable de l'utiliserAlarmManager
pour que votre service puisse s'exécuter périodiquement plutôt qu'en continu .