web-dev-qa-db-fra.com

Exécution périodique de la tâche (une fois par jour / une fois par semaine)

Je veux exécuter une tâche (c'est-à-dire obtenir la page d'actualités de mon site Web) périodiquement (une fois par semaine/par jour), même si mon application est fermée. C'est possible?

41
siemian

Oui, vous devez regarder AlarmManager pour configurer une "alarme" récurrente. C'est mieux pour la durée de vie de la batterie de l'appareil, car contrairement à un service, il ne fonctionne pas constamment en arrière-plan. L'alarme déclenche un récepteur de diffusion qui exécutera votre code personnalisé.

En guise de note finale - il existe des valeurs d'énumération pour le moment de l'alarme, y compris quotidiennement, demi-quotidiennement et bien d'autres encore, bien que vous puissiez simplement définir une valeur réelle.

Un bon exemple peut être trouvé dans le message suivant SO post:

Exemple de gestionnaire d'alarmes

Mise à jour

De nouvelles fonctionnalités ont été ajoutées à Android. Si vous lisez ceci, je vous conseillerais maintenant de regarder GcmNetworkManager . Cela optimise la durée de vie de la batterie et fonctionne avant Lollipop. Pour Lollipop, vous pouvez utiliser JobScheduler . Je conseillerais d'utiliser ces classes sur AlarmManager.

49
Graham Smith

Je pense que le meilleur ajustement est GcmNetworkManager . Fondamentalement, il contient tout ce dont vous avez besoin depuis AlarmManager plus la persistance, de sorte que le travail peut continuer à s'exécuter après le redémarrage.

Exemple:

PeriodicTask task = new PeriodicTask.Builder()
        .setService(MyTaskService.class)
        .setTag(TASK_TAG_PERIODIC)
        .setPeriod(5L)
        .build();

mGcmNetworkManager.schedule(task);
13
surlac

Comme alternative, je compare la semaine en cours:

Calendar cal = Calendar.getInstance();
int currentWeekOfYear = cal.get(Calendar.WEEK_OF_YEAR);

SharedPreferences sharedPreferences= this.getSharedPreferences("appInfo", 0);
int weekOfYear = sharedPreferences.getInt("weekOfYear", 0);

if(weekOfYear != currentWeekOfYear){
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt("weekOfYear", currentWeekOfYear);
    editor.commit();
    // Your once a week code here
}

Je ne préconise pas que c'est mieux que la solution Alarm. Je montre juste une approche différente.

6
aldux