Dans mon billet précédent (Rester productif lorsque votre application n'est pas à l'écran), j'ai expliqué le modèle d'arrière-plan de Windows 8 et comment votre application peut être productive et économe en énergie, même lorsqu'elle n'est pas à l'écran. Dans ce billet, je vais parler des tâches en arrière-plan et montrer comment votre application peut exécuter du code en arrière-plan, même si elle est suspendue. Je vais décrire deux scénarios courants, en prenant un code d'exemple qui vous indique comment exécuter votre propre code d'application en arrière-plan, comment télécharger des messages POP toutes les 15 minutes à l'aide d'une application compatible avec l'écran de verrouillage et comment toutes les applications peuvent fonctionner en arrière-plan lorsque l'appareil est en mode d'alimentation secteur.

Introduction

Les déclencheurs de tâches en arrière-plan sont conçus pour différents scénarios et applications. Les conditions requises et les contraintes au niveau de la gestion des ressources qui leur sont applicables sont par conséquent diverses. Certains déclencheurs de tâches en arrière-plan sont conçus pour les applications qui doivent être actualisées en permanence (messagerie électronique, VoIP), tandis que d'autres sont conçus pour des scénarios plus opportunistes (l'exécution d'une tâche de maintenance en mode d'alimentation secteur ou lorsque certaines conditions système changent). Les applications qui doivent être actualisées en permanence doivent se trouver sur l'écran de verrouillage (le nombre d'applications est limité à 7). Nous en parlerons plus en détail dans le billet. À l'opposé, si vous souhaitez effectuer des tâches opportunistes, les applications peuvent utiliser le déclencheur de maintenance qui s'exécute en mode d'alimentation secteur ou sur certains déclencheurs système. Pour utiliser ces déclencheurs, l'application n'a pas besoin d'être sur l'écran de verrouillage. Les applications qui se trouvent sur l'écran de verrouillage ont des contraintes au niveau de la gestion des ressources moins strictes, car elles doivent s'exécuter plus fréquemment (c'est pour cela que nous en limitons le nombre et que l'utilisateur les contrôle !). J'y reviendrai plus en détail ultérieurement.

Vous n'avez pas besoin d'utiliser des tâches en arrière-plan si vous souhaitez simplement que votre application utilise le contenu le plus récent. Vous pouvez toujours utiliser les vignettes dynamiques ou les notifications planifiées comme nous l'avons expliqué dans le billet Création d'une expérience utilisateur optimale en matière de vignettes. Cette introduction étant faite, plongeons-nous dans le code !

Travailler en arrière-plan lorsqu'un appareil est en mode d'alimentation secteur

Comme nous l'avons vu dans mon billet précédent, il arrive parfois que votre application ait besoin de son propre code pour fournir des fonctionnalités en arrière-plan. Par exemple, imaginons que vous souhaitez ajouter toutes les photos de la bibliothèque d'images dans la base de données de votre application ou que vous voulez les traiter d'une façon ou d'une autre (générer des miniatures par exemple). Cela est possible lorsque votre application s'exécute au premier plan et interagit avec l'utilisateur, mais également en utilisant les tâches en arrière-plan avec un déclencheur de maintenance qui s'exécute en arrière-plan uniquement lorsque l'appareil est en mode d'alimentation secteur. Le déclencheur de maintenance est accessible à tous et votre application n'a pas besoin d'être sur l'écran de verrouillage. L'avantage d'utiliser une tâche d'arrière-plan avec un déclencheur de maintenance est que l'on peut être certain qu'elle n'interfère pas avec l'activité de l'utilisateur et qu'elle s'exécute uniquement en mode d'alimentation secteur. Cela vous permet de ne pas vous soucier de l'utilisation excessive de la batterie.

Cet exemple de code montre la tâche en arrière-plan de maintenance qui appelle la classe ProcessPictures pour traiter les fichiers lors de l'exécution de la tâche. La tâche s'exécute toutes les 8 heures pour rechercher de nouveaux fichiers à traiter. La tâche en arrière-plan s'inscrit également à un gestionnaire d'annulation, car les tâches en arrière-plan de maintenance sont annulées lorsque l'appareil passe sur batterie. Dans le gestionnaire d'annulation, le traitement des fichiers est annulé. Si vous ne revenez pas du gestionnaire d'annulation dans les 5 secondes, Windows arrête l'application. Notez que ces exemples de code supposent une bonne connaissance des classes des tâches en arrière-plan et des déclencheurs. Pour plus d'informations sur ces classes, consultez la documentation sur l'espace de noms Windows.ApplicationModel.Background dans le Centre de développement.

C#
public sealed class MaintenanceBackgroundTask: IBackgroundTask
{
private ProcessPictures processPic;

public MaintenanceBackgroundTask()
{
// Code to process the pictures
processPic = new ProcessPictures();
}

//Main Run method which is activated every 8 hours
async void IBackgroundTask.Run(IBackgroundTaskInstance taskInstance)
{
taskInstance.Canceled += taskInstance_Canceled;

// Because these methods are async, you must use a deferral
// to wait for all of them to complete
BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
List<StorageFile> list = new List<StorageFile>();
int count = await processPic.EnumerateFiles(list);
bool retval = await processPic.ProcessFiles(list);

deferral.Complete();
}

// Cancel handler, called whenever the task is canceled
void taskInstance_Canceled(IBackgroundTaskInstance sender,
BackgroundTaskCancellationReason reason)
{
// Device is now on DC power, cancel processing of files
processPic.Cancel = true;
}
}

 

JavaScript
// This JS lives within maintenanceBackgroundTask.js
var processPic = new processPictures();
var count = 0;
var retval = false;

function onCanceled(cancelSender, cancelReason) {
// Device is now on DC power, cancel processing of files
processPic.cancel = true;
}
backgroundTaskInstance.addEventListener("canceled", onCanceled);

var list = [];
processPic.enumerateFiles(list).then(function (value) {
count = value;
processPic.processFiles(list).then(function (value) {
retval = value;
// Call close() to indicate the task is complete when
// all async methods have completed
close();
});
});
                   

Cet exemple de code montre l'inscription de la tâche en arrière-plan de maintenance depuis l'application principale. Cette tâche en arrière-plan se lance toutes les 8 heures pour traiter les images de la bibliothèque d'images. Si vous n'avez plus besoin d'effectuer cette opération, vous pouvez désinscrire la tâche en arrière-plan à l'aide de la méthode Unregister de la classe IBackgroundTaskRegistration.

C#
//Registering the maintenance trigger background task       
private bool RegisterMaintenanceBackgroundTask()
{
BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
builder.Name = "Maintenance background task";
builder.TaskEntryPoint = "MaintenanceTask.MaintenaceBackgroundTask";
// Run every 8 hours if the device is on AC power
IBackgroundTrigger trigger = new MaintenanceTrigger(480, false);
builder.SetTrigger(trigger);
IBackgroundTaskRegistration task = builder.Register();

return true;
}

 

JavaScript
function registerMaintenanceBackgroundTask() 
{
var builder = new Windows.ApplicationModel.Background.BackgroundTaskBuilder();
builder.name = "Maintenance background task";
builder.taskEntryPoint = "js\\maintenanceBackgroundTask.js";
//Run every 8 hours if the device is on AC power
var trigger = new Windows.ApplicationModel.Background.MaintenanceTrigger(480, false);
builder.setTrigger(trigger);
var task = builder.register();

return true;
}

Vous devez déclarer les tâches en arrière-plan dans le manifeste de votre application. Commencez par ouvrir le manifeste de votre application dans Visual Studio, puis, sous l'onglet Déclarations, ajoutez les déclarations Tâches en arrière-plan dans le menu déroulant. Choisissez le type de tâche approprié et spécifiez votre point d'entrée (nom de classe de la tâche en arrière-plan) ou la page d'accueil si vous utilisez une tâche en arrière-plan JavaScript.

Déclarations du manifeste de la tâche en arrière-plan 
Figure 1. Déclarations du manifeste de la tâche en arrière-plan

Vous pouvez afficher le contenu du manifeste en cliquant dessus avec le bouton droit et en sélectionnant Afficher le code. N'oubliez pas que la tâche de maintenance ne peut s'exécuter que sur l'hôte fourni par le système (backgroundTaskHost.exe ou wwahost.exe pour JavaScript) et que par conséquent, vous ne pouvez pas spécifier d'attribut exécutable. Le type de tâche du déclencheur Maintenance est systemEvent comme vous pouvez le voir ici dans l'extrait de code du manifeste.

<Extension Category="windows.backgroundTasks" EntryPoint="MaintenanceTask.MaintenaceBackgroundTask">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>

Dans JavaScript, le point d'entrée est remplacé par un attribut StartPage.

<Extension Category="windows.backgroundTasks" StartPage="js\maintenaceBackgroundTask.js">

Pour plus d'informations sur l'utilisation des tâches en arrière-plan, consultez le livre blanc Introduction aux tâches en arrière-plan et le Centre de développement sur l'utilisation des API.

Télécharger des messages POP toutes les 15 minutes

Dans cet exemple, l'application doit s'exécuter de façon prévisible et régulière en arrière-plan. Pour ce faire, vous pouvez placer votre application sur l'écran de verrouillage.

Une application utilise les tâches en arrière-plan pour demeurer actualisée en permanence, même lorsque l'utilisateur n'utilise pas son appareil Windows 8. Ainsi, pour contrôler quelles applications peuvent utiliser les tâches en arrière-plan, l'utilisateur doit les autoriser à apparaître sur l'écran de verrouillage. Cela semble tout naturel, car l'écran de verrouillage est conçu pour fournir à l'utilisateur des informations sur ses applications sans avoir besoin de déverrouiller son appareil Windows 8. Cette relation est à deux sens : votre application peut utiliser ces types de tâches en arrière-plan uniquement si elle se trouve sur l'écran de verrouillage et, de même, votre application peut apparaître sur l'écran de verrouillage uniquement si elle demande à utiliser ces types de tâches en arrière-plan.

background2_img2

Figure 2. Interface utilisateur de personnalisation de l'écran de verrouillage et applications compatibles avec l'écran de verrouillage

Comme un nombre relativement restreint d'applications peuvent être placées sur l'écran de verrouillage, il est important pour votre application de bien se comporter sur l'écran de verrouillage. Dans le cas contraire, il est probable que les utilisateurs la supprimeront pour la remplacer par une autre. Parmi les applications qui entrent dans ce cas de figure, on trouve les applications de communication. Il peut s'agir d'une application de messagerie qui affiche le nombre des messages non lus, d'une application de calendrier qui affiche les prochains rendez-vous dans une zone d'état détaillée ou d'une application de messagerie instantanée qui indique combien de messages l'utilisateur a manqués. Vous trouverez plus d'informations sur l'écran de verrouillage, notamment des explications sur ce qui fait qu'une application peut y apparaître, dans le Centre de développement.

Utilisation des déclencheurs de temps pour télécharger des messages toutes les 15 minutes

Ce code d'exemple vous montre comment inscrire une tâche en arrière-plan de déclencheur de temps qui s'exécute toutes les 15 minutes si Internet est disponible, à l'aide de la classe BackgroundTaskBuilder. Si Internet n'est pas disponible, votre tâche en arrière-plan ne s'exécute pas. En revanche, elle attend qu'Internet soit disponible et s'exécute alors automatiquement. Ceci est une autre fonctionnalité utile des tâches en arrière-plan, car elle empêche toutes les opérations inutiles de s'effectuer et préserve l'autonomie de la batterie. Sans cette condition, le code de l'application devrait s'exécuter pour détecter s'il existe une connectivité réseau, puis il générerait une erreur face à l'impossibilité de télécharger les messages. Les messages seront téléchargés, que l'application soit au premier plan ou non. Ils sont également téléchargés si l'appareil est en mode de veille connectée.

C#
private bool RegisterTimeTriggerBackgroundTask()
{
BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
builder.Name = "Pop mail background task";
builder.TaskEntryPoint = "MailClient.PopMailBackgroundTask";
// Run every 15 minutes if the device has internet connectivity
IBackgroundTrigger trigger = new TimeTrigger(15, false);
builder.SetTrigger(trigger);
IBackgroundCondition condition =
new SystemCondition(SystemConditionType.InternetAvailable);
builder.AddCondition(condition);
IBackgroundTaskRegistration task = builder.Register();

return true;
}
JavaScript
function registerTimeTriggerBackgroundTask() 
{
var builder = new Windows.ApplicationModel.Background.BackgroundTaskBuilder();
builder.name = "Pop mail background task";
builder.taskEntryPoint = "js\\popMailBackgroundTask.js";
//Run every 15 minutes if the device has internet connectivity
var trigger = new Windows.ApplicationModel.Background.TimeTrigger(15, false);
builder.setTrigger(trigger);
var condition = new Windows.ApplicationModel.Background.SystemCondition(
Windows.ApplicationModel.Background.SystemConditionType.internetAvailable);
builder.addCondition(condition);
var task = builder.register();

return true;
}

Le déclencheur de temps est accessible uniquement sur les applications qui se trouvent sur l'écran de verrouillage, comme décrit précédemment. Pour demander par programme son placement sur l'écran de verrouillage, vous devez utiliser la classe BackgroundExecutionManager. Si l'utilisateur ne place pas votre application sur l'écran de verrouillage, vos tâches en arrière-plan ne s'exécutent pas. Dans ce cas, vous devrez peut-être revenir à l'utilisation d'une tâche en arrière-plan qui ne requiert pas l'écran de verrouillage ou réaliser les opérations lorsque l'utilisateur utilise votre application. Pour que l'utilisateur ne soit pas sollicité à l'infini, le système invite l'utilisateur une seule fois. S'il répond non et qu'il souhaite effectuer l'opération plus tard, il peut le faire manuellement.

C#
public async Task<bool> ObtainLockScreenAccess()
{
BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();

if (status == BackgroundAccessStatus.Denied || status == BackgroundAccessStatus.Unspecified)
{
return false;
}

return true;
}

 

JavaScript
function obtainLockScreenAccess()
{
Windows.ApplicationModel.Background.BackgroundExecutionManager.requestAccessAsync().then(function (status) {
if (status === Windows.ApplicationModel.Background.BackgroundAccessStatus.denied ||
status === Windows.ApplicationModel.Background.BackgroundAccessStatus.unspecified){
return false;
}
return true;
});
}

Cet exemple de code montre la tâche en arrière-plan principale qui télécharge les messages toutes les 15 minutes. Il n'entre pas dans les détails de la mise à jour des vignettes et des badges de votre application, car cela a déjà été traité dans le billet de blog Création d'une expérience utilisateur optimale en matière de vignettes.

C#
void IBackgroundTask.Run(IBackgroundTaskInstance taskInstance)
{
int count = popmailClient.GetNewMails();
// Update badge on lock screen with the mail count
popmailClient.UpdateLockScreenBadgeWithNewMailCount(count);

IList<string> mailheaders = popmailClient.GetNewMailHeaders();
// Update app tile with the subjects of the email
popmailClient.UpdateTileWithSubjects(mailheaders);
}

 

JavaScript
//This JS lives within popMailBackgroundTask.js
var count = popmailClient.getNewMails();
// Update badge on lock screen with the mail count
popmailClient.updateLockScreenBadgeWithNewmailCount(count);

var mailheaders = popmailClient.getnewMailHeaders();
// Update app tile with the subjects of the email
popmailClient.updatetileWithSubjects(mailheaders);
close();

Pour ajouter votre application à l'écran de verrouillage, elle doit indiquer le type des notifications de l'écran de verrouillage disponibles dans l'onglet Interface utilisateur de l'application du manifeste.


Figure 3. Déclarations du manifeste de la tâche en arrière-plan

Il s'agit d'un extrait de code du manifeste (généré par l'assistant) d'une application qui doit se trouver sur l'écran de verrouillage et qui affiche des badges et des toasts sur l'écran de verrouillage. La tâche du déclencheur de temps ne peut s'exécuter que sur l'hôte fourni par le système (backgroundTaskHost.exe ou wwahost.exe pour JavaScript) et par conséquent, vous ne pouvez pas spécifier d'attribut exécutable. Le type de tâche est « timer », comme vous pouvez le voir dans le manifeste.

<LockScreen Notification="badgeAndTileText" BadgeLogo="Images\badgelogo.png" />
<DefaultTile ShowName="allLogos" WideLogo="Images\tile-sdk.png" ShortName="LockScreen CS" />
<SplashScreen Image="Images\splash-sdk.png" BackgroundColor="#FFFFFF" />
</VisualElements>
<Extensions>
<Extension Category="windows.backgroundTasks" EntryPoint="MailClient.PopMailBackgroundTask">
<BackgroundTasks>
<Task Type="timer" />
</BackgroundTasks>
</Extension>

Dans JavaScript, le point d'entrée est remplacé par un attribut StartPage.

<Extension Category="windows.backgroundTasks" StartPage="js\popMailBackgroundTask.js"

 

Scénarios avancés

Vous pouvez créer des applications plus avancées VOIP, de messagerie instantanée ou de messagerie électronique d'émission à l'aide d'autres déclencheurs de tâches en arrière-plan, tels que Canal de contrôle ou Notification d'émission. Leur utilisation sort du cadre de ce billet et vous trouverez plus d'informations à leur sujet dans le livre blanc Réseau en arrière-plan.

Gestion des ressources pour les tâches en arrière-plan

Comme nous l'avons déjà indiqué, les tâches en arrière-plan ont été conçues pour optimiser l'efficacité en énergie et par conséquent, pour que des contraintes d'utilisation des ressources processeur et réseau leur soient appliquées. Cela empêche une application en arrière-plan d'épuiser la batterie de l'appareil sans que l'utilisateur n'en soit conscient. Si une application est active et que l'utilisateur interagit avec elle au premier plan, aucune contrainte d'utilisation des ressources processeur ou réseau n'est appliquée aux tâches en arrière-plan de l'application.

Contraintes au niveau des ressources processeur

Chaque application sur l'écran de verrouillage reçoit 2 secondes du temps processeur toutes les 15 minutes, qui peuvent être employées par toutes les tâches en arrière-plan de l'application. À la fin des 15 minutes, chaque application sur l'écran de verrouillage reçoit 2 autres secondes du temps processeur que les tâches en arrière-plan peuvent utiliser. Le temps processeur inutilisé dans l'intervalle des 15 minutes est perdu et l'application ne peut pas les cumuler. Chaque application qui n'est pas sur l'écran de verrouillage reçoit 1 seconde de temps processeur toutes les 2 heures. Si l'application utilise tout son temps processeur disponible, ses tâches en arrière-plan sont suspendues jusqu'à ce que le quota processeur de l'application soit réapprovisionné lors de la prochaine actualisation des quotas processeur.

Le temps processeur se rapporte à l'utilisation réelle du processeur par l'application, et non au temps Horloge de la tâche en arrière-plan. Par exemple, si la tâche en arrière-plan attend dans son code que le serveur distant réponde et si elle n'utilise pas le processeur, alors cette attente n'est pas comptabilisée dans le quota processeur.

Contraintes au niveau des ressources processeur sur les tâches en arrière-plan

 

Quota des ressources processeur

Période d'actualisation

Application compatible avec l'écran de verrouillage

2 secondes processeur

15 minutes

Application non compatible avec l'écran de verrouillage

1 seconde processeur

2 heures

Contraintes au niveau des ressources réseau

L'utilisation du réseau pouvant affecter considérablement l'autonomie de la batterie d'un appareil, elle est également soumise à des contraintes pendant l'exécution des tâches en arrière-plan. Mais si un appareil s'exécute en mode d'alimentation secteur, alors les tâches en arrière-plan ne connaissent pas de contraintes réseau. L'utilisation du processeur pour une tâche en arrière-plan est toujours contrainte au niveau des ressources, même si l'appareil s'exécute en mode d'alimentation secteur.

Ce tableau caractérise le débit des données réseau, pour un réseau WiFi subissant des contraintes de ressources, en supposant une interférence minimale.

Débit moyen de l'interface réseau

Débit des données, mégaoctets (Mo)
pour les applications compatibles avec l'écran de verrouillage

Débit des données, en Mo, pour les applications non compatibles avec l'écran de verrouillage

Toutes les 15 minutes

Par jour

Par jour

10 Mbits/s

1,875

180

30

 

Pool global

Même avec le quota attribué de chaque application, il arrive parfois que ces contraintes fixes au niveau des ressources ne soient pas suffisantes. Dans ce cas, il existe un pool global partagé auprès duquel les applications peuvent demander des ressources processeur et réseau.

Pour en savoir plus sur les tâches en arrière-plan, le pool global, ses contraintes en gestion des ressources et les meilleures pratiques, consultez le livre blanc Introduction aux tâches en arrière-plan. Il comprend également un exemple de projet avec sa source.

Résumé

Ainsi, la réponse à la question, « Mon application peut-elle effectuer une opération si elle n'est pas à l'écran ? » est un oui retentissant. Le modèle d'arrière-plan dans Windows 8 permet à votre application d'accomplir des scénarios clés pour l'utilisateur final, par exemple télécharger des fichiers, lire des données audio, mettre à jour les messages électroniques en arrière-plan ou effectuer des tâches de maintenance lorsque l'appareil est en mode d'alimentation secteur. Et comme la plateforme surveille étroitement ces activités, vos tâches en arrière-plan ont un impact minimal sur la réactivité des applications qui sont au premier plan ou sur l'autonomie de la batterie de votre appareil.

Si vous souhaitez des informations techniques plus détaillées sur le modèle d'arrière-plan dans Windows 8, accédez au Centre de développement et consultez les différents livres blancs. Si vous avez des questions, n'hésitez pas à les poser ici dans les commentaires et nous essaierons d'y répondre du mieux possible.

-- Hari Pulapaka, Chef de projet, Windows.

Merci à Jake Sabulsky, Johnny Bregar, Kyle Beck et à Suhail Khalid pour leurs contributions, ainsi qu'à de nombreuses autres personnes pour leurs précieux commentaires, notamment Alexander Corradini, Arun Kishan, Ben Srour, Ian LeGrow, Jamie Schwartz et John Sheehan.

Ressources

Lien

Type

Points forts

Introduction aux tâches en arrière-plan

Livre blanc

Présente les tâches en arrière-plan.

Espace de noms sur l'API de modèle d'arrière-plan

Documents

Espace de noms sur l'API de modèle d'arrière-plan

Projet d'exemple des tâches en arrière-plan

Projet d'exemple

Montre l'utilisation des tâches en arrière-plan.

Présentation de l'écran de verrouillage

Documentation conceptuelle

Explique l'écran de verrouillage et ses meilleures pratiques.

Réseau en arrière-plan

Livre blanc

Montre comment développer des applications avancées, telles que VOIP et la messagerie instantanée avec des tâches en arrière-plan.

Création d'une expérience utilisateur optimale en matière de vignettes

Billet de blog

Montre comment créer une expérience utilisateur optimale en matière de vignettes