42 votes

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. Est-ce possible ?

49voto

Graham Smith Points 7963

Oui, il faut regarder le AlarmManager pour configurer une "alarme" récurrente. Cette option est plus avantageuse pour l'autonomie de la batterie de l'appareil, car contrairement à un service, elle ne fonctionne pas constamment en arrière-plan. L'alarme déclenche un récepteur de diffusion qui exécutera votre code personnalisé.

Enfin, il existe des valeurs d'énumération pour le moment de l'alarme, notamment quotidienne, semi-journalière et bien d'autres, mais vous pouvez simplement définir une valeur réelle.

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

Exemple de gestionnaire d'alarme

Mise à jour

De nouvelles fonctionnalités ont été ajoutées à Android. Si vous lisez ceci, je vous conseille de vous pencher sur les points suivants GcmNetworkManager . Cela optimise la durée de vie de la batterie et fonctionne avant Lollipop. À partir de Lollipop, vous pouvez utiliser JobScheduler . Je conseille d'utiliser ces classes plutôt que l'AlarmManager.

13voto

Ruslan Sharifullin Points 1435

Je pense que le meilleur ajustement est GcmNetworkManager . En fait, il a tout ce dont vous avez besoin de AlarmManager, plus la persistance, de sorte que le travail peut continuer à être exécuté après un redémarrage.

Exemple :

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

mGcmNetworkManager.schedule(task);

9voto

aldux Points 1128

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 dis pas que cette solution est meilleure que celle de l'alarme. Je montre simplement une approche différente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X