Dans le billet Gestion du cycle de vie pour que vos applications soient « toujours réactives », Adam Barrus décrit le nouveau cycle de vie qui a été introduit dans Windows 8. La question qui revient le plus souvent est la suivante : « Que faire si mon application doit effectuer une tâche importante alors qu'elle se trouve hors écran, par exemple télécharger un fichier, un message électronique ou lire de la musique ? ». Dans cette série de deux billets, je vais décrire les différents types d'activités qu'une application peut effectuer lorsqu'elle se trouve en arrière-plan, puis montrer des exemples de code prenant en charge ces scénarios.

Modèle d'arrière-plan Windows 8

La préservation de l'autonomie de la batterie a été l'un des piliers de la conception de Windows 8 et de son modèle d'application. Le billet de Pat Stemen sur le blog Conception de Windows 8 explique en détail en quoi ce paramètre est si important dans la conception de Windows 8 et décrit certaines des techniques que nous avons intégrées au système en vue d'optimiser l'autonomie de la batterie. Comme vous pouvez l'imaginer, les applications qui s'exécutent sur un appareil constituent l'un des facteurs les plus déterminants de son autonomie. En gardant cela à l'esprit, nous avons conçu le cycle de vie des applications Windows 8 pour une autonomie maximale. Mais cela ne signifie pas que le modèle d'application empêche les activités en arrière-plan. Ce billet présente les scénarios d'arrière-plan pris en charge dans Windows 8. Pour en savoir plus, consultez le billet Optimisation de l'efficacité énergétique des applications rédigé par Ben Srour et Sharif Farag sur le blog Conception de Windows 8.

Pour concevoir le modèle d'arrière-plan de Windows 8, nous avons identifié les cas les plus courants dans lesquels vous voulez qu'une application réalise des actions en arrière-plan et avons ajouté des API permettant d'économiser la batterie. Ce sont ces scénarios que Windows 8 prend en charge (également définis dans le billet sur l'optimisation de l'efficacité énergétique) :

Scénario

Description

Téléchargement montant ou descendant en arrière-plan

Les applications peuvent utiliser l'API de transfert en arrière-plan pour effectuer des téléchargements montants et descendants en arrière-plan. Le système d'exploitation lui-même effectue des téléchargements montants et descendants. Ainsi, le code de l'application sort du cadre de fonctionnement, ce qui contribue à améliorer l'autonomie de la batterie.

Lecture audio en arrière-plan

Nous tenons absolument à ce que vous puissiez écouter de la musique en arrière-plan. Toutes les applications multimédias et les applications de communication sont capables de lire des données audio en arrière-plan. Pour plus d'efficacité, nous suspendons l'application lorsque l'utilisateur interrompt la lecture audio.

Partage

Si votre application envoie du contenu à un service cloud par le biais de l'icône Partager, elle termine l'opération en arrière-plan. Vous trouverez plus d'informations sur le transfert des données à l'aide de l'opération de partage dans le Centre de développement.

Synchronisation d'appareils

Vous pouvez synchroniser des contenus entre un appareil connecté (un appareil photo, par exemple) et votre PC, même si l'application n'est pas visible à l'écran.

Vignettes dynamiques

Les applications peuvent afficher le contenu le plus récent sur leurs vignettes (même si elles sont suspendues) en envoyant des notifications en mode push à votre PC Windows 8. Pour plus d'informations, consultez le billet Création d'une expérience utilisateur optimale en matière de vignettes.

Notifications planifiées

Les applications peuvent vous informer d'un événement à une heure spécifique, soit en mettant à jour une vignette à telle ou telle heure (pour un rendez-vous, par exemple), soit en affichant une notification. L'application planifie ces événements, mais Windows se charge de l'envoi de la notification, ce qui limite l'incidence de l'opération sur l'autonomie. Pour plus d'informations, consultez le Centre de développement.

Tâches en arrière-plan

Si une application suspendue doit exécuter son propre code pour fournir ses fonctionnalités, Windows 8 vous permet de créer des tâches en arrière-plan. Ces tâches en arrière-plan s'exécutent en réponse à des déclencheurs externes (par exemple des événements système ou horaires ou une notification en mode push entrante). Elles sont soumises à des contraintes au niveau des ressources afin de faciliter l'exécution des activités d'arrière-plan de façon optimisée sur le plan de la consommation. Les exemples les plus courants sont les applications de messagerie, de voix sur IP et de messagerie instantanée. Ces applications peuvent synchroniser vos données, en arrière-plan lorsque l'appareil fonctionne sur batterie ou en mode de veille connectée. Ces sujets seront développés dans le prochain billet de cette série.

Regardons maintenant comment implémenter certains scénarios courants dans les applications de style Metro. Nous allons également examiner certains des détails techniques de ces fonctionnalités et expliquer certains de leurs aspects.

La liste ci-dessous répertorie les scénarios que nous décrivons dans cette série. Les deux premiers éléments de la liste sont décrits dans ce billet, tandis que les deux derniers feront l'objet de notre prochain billet.

  • Téléchargement montant ou descendant en arrière-plan
  • Lecture audio en arrière-plan
  • Tâches en arrière-plan : travailler en arrière-plan lorsqu'un appareil est en mode d'alimentation secteur
  • Tâches en arrière-plan : téléchargement de messages électroniques depuis le serveur de messagerie POP3 toutes les 15 minutes

Examinons maintenant en détail le code et observons la simplicité de cette opération sous Windows 8. L'échantillon de code inclus ici n'est qu'un exemple ; il ne s'agit pas d'un échantillon complet dans tous ses aspects. Par exemple, nous ne couvrons pas la gestion des erreurs.

Téléchargement montant ou descendant en arrière-plan

Le transfert de contenu (téléchargement montant de photos, téléchargement descendant de vidéos ou de musique) est un scénario courant pour de nombreuses applications. L'espace de noms BackgroundTransfer procure une API simple et riche qui vous permet de transférer les données au premier plan comme en arrière-plan. L'API réalise la majeure partie du travail afin que vous puissiez vous concentrer sur ce que votre application fait de mieux. Elle est optimisée pour l'efficacité énergétique, résiste aux problèmes réseau et est rentable en matière de coût réseau. Examinons un exemple précis : comment télécharger un fichier avec BackgroundTransfer.

BackgroundDownloader est la classe principale qui vous permet d'effectuer la plupart des téléchargements montants ou descendants en arrière-plan. L'exemple ci-dessous montre la création d'un objet DownloadOperation à l'aide de la classe BackgroundDownloader, qui intègre un URI source et un fichier de destination. Une fois le téléchargement configuré, la méthode HandleDownloadAsync est appelée pour lancer le téléchargement. Dans l'exemple JavaScript, nous commençons le téléchargement inline sans appeler aucune autre fonction.

JavaScript

function downloadFile(uri, destinationFile) 
{
// Create a new download operation.
download = downloader.createDownload(uri, newFile);
// Start the download and persist the promise to be able to cancel the download.
promise = download.startAsync().then(complete, error, progress);
}
                

C#

private async void DownloadFile(Uri source, StorageFile destinationFile)
{
BackgroundDownloader downloader = new BackgroundDownloader();
DownloadOperation download = downloader.CreateDownload(source, destinationFile);

// Attach progress and completion handlers.
await HandleDownloadAsync(download, true);
}
             

Cet exemple de code montre l'association de gestionnaires à un nouvel objet DownloadOperation avant d'appeler StartAsync pour réellement initier le téléchargement. La même méthode est également utilisée pour réassocier vos gestionnaires en appelant AttachAsync lors de l'énumération des opérations de téléchargement comme expliqué ci-dessous.

C#

private async Task HandleDownloadAsync(DownloadOperation download, bool start)
{
// Create progress callback
Progress<DownloadOperation> progressCallback = new Progress<DownloadOperation>(DownloadProgress);
// Create cancellation token
CancellationTokenSource cts = new CancellationTokenSource();

if (start)
{
// Start the download and attach a progress handler.
await download.StartAsync().AsTask(cts.Token, progressCallback);
}
else
{
// The download was scheduled in a previous session, re-attach the progress handler.
await download.AttachAsync().AsTask(cts.Token, progressCallback);
}
}


Lorsqu'une application commence une opération de téléchargement en arrière-plan, même si elle est suspendue, ces opérations de téléchargement continuent en arrière-plan. À la prochaine reprise de votre application, vous recevez les rappels de progression et d'achèvement de ces opérations de téléchargement. Si votre opération est arrêtée après sa suspension, l'énumération de vos opérations de téléchargement redémarre les opérations de téléchargement en arrière-plan précédemment mises dans la file d'attente. Les exemples de code suivants vous montrent comment énumérer vos opérations de téléchargement en C# et JavaScript.

C#

// Enumerate downloads that were running in the background before the app was closed.
private async Task DiscoverActiveDownloadsAsync()
{
activeDownloads = new List<DownloadOperation>();

// Get all current download operations
IReadOnlyList<DownloadOperation> downloads = await BackgroundDownloader.GetCurrentDownloadsAsync();

if (downloads.Count > 0)
{
List<Task> tasks = new List<Task>();
foreach (DownloadOperation download in downloads)
{
// Attach progress and completion handlers.
tasks.Add(HandleDownloadAsync(download, false));
}

await Task.WhenAll(tasks);
}
}
               
JavaScript
function discoverActiveDownloads() 
{
// Enumerate outstanding downloads.
Windows.Networking.BackgroundTransfer.BackgroundDownloader.getCurrentDownloadsAsync().done
(function (downloads) {
// If downloads from previous app state exist, reassign callbacks and persist to global array.
for (var i = 0; i < downloads.size; i++) {
download[i].attachAsync().then(complete, error, progress);
}
}
}

Les opérations de téléchargement montant et descendant font l'objet des mêmes contraintes en termes de ressources que les autres tâches en arrière-plan expliquées dans le prochain billet de cette série. Pour en savoir plus sur BackgroundTransfer, consultez la présentation du transfert des données en arrière-plan, de l'espace de noms de l'API, de l'exemple de téléchargement de transfert en arrière-plan ou regardez la session //BUILD sur la création d'applications sociales et connectées avec les services HTTP.

Lecture audio en arrière-plan

Dans Windows 8, il est maintenant très facile de développer une application capable de lire des données audio de manière simple et économe énergétiquement. Windows 8 offre des contrôles au niveau du système qui sont conçus pour optimiser l'expérience utilisateur au sein de la classe MediaControl, à l'aide du classement des flux et des contrôles de transport de média. Cette section a pour objectif de faire lire des données audio en arrière-plan à votre application. Nous n'entrons pas ici dans les détails en ce qui concerne la lecture audio ou les classes MediaControl. Pour plus d'informations sur les technologies audio, consultez le livre blanc sur la lecture audio dans une application de style Metro.

Pour lire des données audio en arrière-plan, l'application doit respecter trois conditions importantes :

  • Le manifeste de l'application doit comporter une déclaration audio en arrière-plan.
  • Vous devez définir la catégorie des flux (msAudioCategory) sur Communications ou sur BackgroundCapableMedia.
  • Votre application doit s'inscrire aux contrôles de transport de média.

Pour ajouter la déclaration audio en arrière-plan à votre application, ouvrez simplement le manifeste de l'application dans Visual Studio. Sous l'onglet Déclarations, sélectionnez l'élément Tâches en arrière-plan dans le menu déroulant des déclarations et ajoutez-le au manifeste. Pour Types de tâches pris en charge, sélectionnez Audio et indiquez la page d'accueil de votre application JavaScript ou le point d'entrée si votre application est en C#, C++ ou en VB.

Déclarations du manifeste dans Visual Studio

Pour lire des données audio dans une application, le plus simple est d'utiliser l'élément HTML5 <audio>. L'ajout d'un attribut msAudioCategory à votre élément <audio> permet au système d'optimiser les performances et d'améliorer l'expérience utilisateur en ce qui concerne les données audio de votre application. Il permet par exemple d'utiliser des méthodes de lecture basse consommation lorsque cela est possible, permettant la lecture de certains sons lorsque l'application est en arrière-plan ou dans certains cas, réduisant le volume ou désactivant certains sons pour s'assurer que les autres sont clairement entendus.

Voici un échantillon de code HTML permettant de lire des données audio et de définir la catégorie audio de façon appropriée.

<audio msAudioCategory="BackgroundCapableMedia" controls="controls"> 
<source src="song.mp3"/>
</audio>

Voici un code JavaScript visant à accomplir les mêmes fonctionnalités. Vous devez définir l'attribut msAudioCategory avant de définir l'élément source. Sinon, le système ne verra pas la catégorie audio.

JavaScript
function PlayAudio () 
{
// Create new audio tag for "BackgroundCapableMedia" class
if(!audtag)
{
audtag = document.createElement('audio');
audtag.setAttribute("id", "audtag");
audtag.setAttribute("controls", "true");
audtag.setAttribute("msAudioCategory", "backgroundcapablemedia");
audtag.setAttribute("src", "song.mp3");
document.getElementById("scenario1Output").appendChild(audtag);
audtag.load();
}
}
        

Voici un code C# d'exemple permettant de définir la catégorie audio sur un flux audio en sortie. Utilisez la fonction SelectFile pour sélectionner un fichier à l'aide de FileOpenPicker, puis définissez AudioCategory sur le flux sélectionné en appelant SetAudioCategory.

C#
public async void SelectFile()
{
// Choose file using the picker
Windows.Storage.Pickers.FileOpenPicker picker = new Windows.Storage.Pickers.FileOpenPicker();
picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.MusicLibrary;

// Add a filter so only mp3 files are displayed
picker.FileTypeFilter.Add(".mp3");
Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
if (file != null)
{
var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
OutputMedia.AutoPlay = false;

// Run on the UI thread because it updates UI controls
await cw.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
OutputMedia.SetSource(stream, file.ContentType);
});
}
}

// Set the audio category on the output stream
public void SetAudioCategory(AudioCategory category)
{
OutputMedia.AudioCategory = category;
}
      

Deux catégories audio sont compatibles avec l'arrière-plan (c'est-à-dire qu'elles permettent à votre application de lire des données audio en arrière-plan) : BackgroundCapableMedia et Communications. Selon le type de flux audio qui est en cours de lecture, choisissez la catégorie audio appropriée afin que le système puisse choisir les caractéristiques de performances optimales pour votre flux audio.

Type de flux audio

Description

BackgroundCapableMedia

Pour les données audio dont la lecture doit continuer en arrière-plan. Voici quelques exemples :

· Lecture de fichiers multimédias locaux

· Sélection de musique locale

· Radio diffusée en continu

· Sélection de musique diffusée en continu

· Vidéos musicales

· Données audio /radio, YouTube, Netflix, etc. diffusées en continu

Communications

Pour la communication audio diffusée en continu, par exemple :

· Voix sur IP (VoIP)

· Discussion en temps réel ou autre type d'appel téléphonique

Une application de style Metro Windows 8 occupe tout l'écran, ce qui signifie que si un utilisateur de votre application écoute de la musique en arrière-plan, il n'est pas possible d'arrêter rapidement la musique à moins d'inscrire l'application aux contrôles de transport. Les contrôles de transport système apparaissent à l'écran si l'application est inscrite et si l'utilisateur appuie sur l'un des boutons de volume physiques. Pour en savoir plus sur l'ajout des contrôles de transport de média à votre application de style Metro, consultez le guide du développeur sur les contrôles de transport système.

Et c'est tout ! Votre application est maintenant capable de lire des données audio en arrière-plan sans être suspendue. Mais comme la lecture audio s'effectue en arrière-plan, l'application reste active et il vous incombe de vous assurer que votre application n'utilise pas toutes les performances système ou l'autonomie de la batterie. Dès que votre application arrête la lecture audio, Windows la suspend. Pour plus d'informations, consultez le livre blanc sur la lecture audio dans une application de style Metro.

Résumé

Nous terminons ici la première partie de notre série sur la productivité en arrière-plan. Dans ce billet, vous avez appris à lire des données audio en arrière-plan et à effectuer des téléchargements montants ou descendants en arrière-plan pendant la suspension de votre application. Dans la prochaine partie, vous apprendrez à écrire votre propre code pour fournir des fonctionnalités en arrière-plan pendant la suspension de votre application, à l'aide des tâches en arrière-plan.

-- Hari Pulapaka
    Chef de projet, Windows

Ressources

Lien

Type

Points forts

Transfert de données en arrière-plan

Démarrage rapide

Documentation conceptuelle sur le transfert en arrière-plan

Espace de noms de l'API

Documents sur l'API

Espace de noms sur l'API de transfert en arrière-plan

Exemple de téléchargement de transfert en arrière-plan

Projet d'exemple

Application d'exemple démontrant l'utilisation de l'API de transfert en arrière-plan

Création d'applications sociales et connectées avec les services HTTP

Session //BUILD

Session //BUILD expliquant comment créer des applications connectées

Lecture audio dans une application de style Metro

Livre blanc

Livre blanc sur la lecture audio en arrière-plan

Guide du développeur sur les contrôles de transport système

Livre blanc

Livre blanc sur l'utilisation des contrôles de transport de média pour développer des applications musicales

Espace de noms de l'API

Documents sur l'API

API de prise en charge de média de base