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 ?
Réponses
Trop de publicités?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.
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);
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.