Créer un agent périodique qui modifie la tuile

Créer un agent périodique qui modifie la tuile

Jusqu’à maintenant, pour mettre à jour une tuile, il fallait obligatoirement posséder un serveur web qui via le push notification, demandait au téléphone de mettre à jour la tuile.

Grâce à mango et à l’ajout des scheduled agents, ce serveur n’est plus forcément obligatoire. Nous pouvons maintenant créer un agent (une tâche de fond qui va s’exécuter 25 secondes toutes les demi heures (environ)) qui va récupérer des informations et générer une nouvelle tuile à partir de ces informations.

Si vous ne savez pas comment créer une tuile additionnelle, lisez cet article http://www.rudyhuyn.com/blog/2011/05/24/comment-ajouter-des-tuiles-additionnelles-a-son-application/

Création de l’agent

Nous allons commencer par créer notre agent, cela se fait de façon très simple.

Sous visual, sélectionnez la solution, faites un clic droit et sélectionner “ajouter > créer un nouveau projet” :

Sélectionnez maintenant un projet de type “Windows Phone Scheduled Task Agent”

et validez.

Vous avez maintenant deux projets dans votre solution, un correspondant à votre application et un correspondant à la tâche qui sera appelé toutes les 30 minutes. Avant d’aller plus loin, il faut lier les deux projets. Sélectionnez votre projet principal, faites un clic droit sur “references” et sélectionnez dans l’onglet “projets” le projet correspondant à votre agent.

Sans vous en rendre compte, Visual à modifié le fichier WMAppManifest de votre projet afin d’ajouter la référence vers votre agent :

<Tasks>
<DefaultTask Name="_default" NavigationPage="MainPage.xaml" />
<ExtendedTask Name="BackgroundTask">
<BackgroundServiceAgent Specifier="ScheduledTaskAgent" Name="MyScheduledTaskAgent" Source="MyScheduledTaskAgent" Type="MyScheduledTaskAgent.ScheduledAgent" />
</ExtendedTask>
</Tasks>

Il suffit maintenant de démarrer l’agent, mais avant cela, il faut savoir que pour être validé, une application doit permettre à l’utilisateur de démarrer ou stopper les agents à sa guise, nous allons donc ajouter un togglebutton dans ce but :


 

private void ToggleButton_Click(object sender, System.Windows.RoutedEventArgs e)
{

string name="MyScheduledTaskAgent";
if (!((ToggleButton)sender).IsChecked.Value)
{
...//désactiver l'agent
}
else
{
...//activer l'agent
}
}

La variable “Name” représente ici le nom de votre tâche (le nom du projet sauf si vous l’avez modifié).

Il nous reste à compléter le code.

Pour supprimer un agent, il suffit de le rechercher et si on le trouve, alors on demande au service SchedultedAction de le supprimer de sa liste

var periodicTask = ScheduledActionService.Find(name) as PeriodicTask;
if (periodicTask != null)
ScheduledActionService.Remove(name);

De la même façon, pour activer un agent, on commence par vérifier qu’il n’existe pas, s’il existe déjà, alors on le supprime, il nous reste alors à le créer via une PeriodicTask et de l’ajouter au service ScheduledAction.

var periodicTask = ScheduledActionService.Find(name) as PeriodicTask;
if (periodicTask != null)
ScheduledActionService.Remove(name);

periodicTask = new PeriodicTask(name) { Description="this is a test agent"};
ScheduledActionService.Add(periodicTask);

Dernière chose, il faut initialiser la valeur IsChecked de notre bouton au chargement de la page, en écrivant dans le constructeur :

var periodicTask = ScheduledActionService.Find(AgentName) as PeriodicTask;
ToggleAgent.IsChecked = periodicTask != null;

Maintenant que nous avons mis en place notre agent, nous allons lui demander de mettre à jour la tuile de notre application. Il y a deux écoles à ce sujet : tout mettre dans le projet correspondant à l’agent, ou créer une troisième librairie contenant les fonctionnalités communes entre l’application et l’agent, comme notamment la fonction générant la tuile.

Personnellement, je préfère la 2ème méthode que je trouve plus propre.

Créons donc un troisième projet de type “librairie de classe” et ajoutons le comme référence aux deux autres projets (application et agent).

Créons une classe nommée TileGenerator et ajoutons une méthode

public static StandardTileData GenerateTile()

Dans cette méthode nous allons créer le contenu de la tuile. Nous allons créer une tuile très simple avec uniquement un titre et l’heure courante au dos de la tuile afin de valider la mise à jour. Dans un article à suivre, nous créerons un vrai contenu pour cette tuile en générant nous même les images de celle-ci.

public static StandardTileData GenerateTile()
{
return new StandardTileData()
{

Title="test time",
BackContent=DateTime.Now.ToShortTimeString()
}
}

Modifions maintenant l’agent pour qu’il mette à jour la tuile :

public class ScheduledAgent : ScheduledTaskAgent
{
protected override void OnInvoke(ScheduledTask task)
{

var tile = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString() == "/MainPage.xaml");
tile.Update(CustomTile.TileGenerator.GenerateTile());
NotifyComplete();
}
}

Mettre à jour la tuile quand on sort de l’application

Un dernier point, lorsque l’on est dans l’application et qu’on en sort, pourquoi pas en profiter pour mettre à jour la tuile sans attendre que l’agent s’exécute (dans 30 minutes).

Il suffit donc dans le fichier app.xaml.cs de reprendre le code que l’on a utilisé dans l’agent, mais pour éviter la redondance de code, nous allons externaliser la fonction de mise à jour des tuiles dans la librairie commune :

      public static void UpdateTiles()
        {
            var tile = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString() == "/MainPage.xaml");
            tile.Update(CustomTile.TileGenerator.GenerateTile());
        }

 

Téléchargez le code source du projet : CustomTile

Comments are closed.