Après-midi du développement - Windows Phone Mango

Featured image

Mercredi 1er juin nous avons passé une demi-journée dans les locaux de Microsoft pour une tour des évolutions du développement sur la nouvelle version de Windows Phone 7.1 alias Mango

Avec plus de 1500 APIs, le nouveau SDK Windows Phone 7 s’agrandit considérablement : Réalité augmentée, capteurs, multitasking, intégration de Silverlight et XNA dans la même application, base de données locale, nouveaux scénarios de notifications, accès à plus de donnés du téléphone’€¦ sans compter les nouveaux outils pour le développeur ! De quoi revoir et améliorer vos applications existantes, mais aussi créer de nouveaux usages. Un beau programme pour une après-midi du développement riche en fruits frais !

Cette session a été présentée par Luc Vo Van, David CATUHE, Pierre Cauchois

Visual Studio

Les projets

Après l’installation du nouveau SDK téléchargeable ici

Quatre nouveau templates de projet seront présent dans Visual Studio 2010 pour développer vos applications Mango.

Chacun de ces Templates étant lié à une nouvelle fonctionnalité de Mango.

Le multi-targeting est aussi présent et nous laisse le choix de la version de Windows Phone.

Il est facilement possible de mettre à jour vos applications existantes vers 7.1 gr’ce à un Wizzard. Attention cependant le retour vers 7.0 peut être plus compliqué, donc faites des tests de migration sur une copie de votre projet ou sur une nouvelle branche.

A noté cependant qu’il n’est pas obligatoire de migrer vers 7.1 pour que les applications fonctionnent sur le future système, elles pourront fonctionner sans problème et bénéficierons même de meilleures performances liées aux améliorations du système.

L’émulateur

L’émulateur permet maintenant de simuler une activité des sensors : Accéléromètre et GPS

Pour l’accéléromètre les positions prédéfinies du téléphone sont sélectionnable dans une liste bien qu’il soit tout aussi possible de modifier la position simplement avec la souris. De plus, nous pouvons jouer des scénarios de données comme le ‘« shake ‘».

Pour la partie location, bing map est affiché dans la fenêtre (étonnant) et permet de créer soit par simple clique sur la carte soit par recherche un parcours (une liste de coordonnées). Ce parcours est ensuite joué c’est-à-dire un changement de point toutes les x seconde.

Profiler

Un profiler dédier au projet WP7 a été ajouté, il n’est pas à l’heure actuelle dans sa version définitive, mais il permet déjà de pouvoir ciblé certains problèmes de frame rate et d’utilisation de thread sur la CPU/GPU.

RunTime

La CRL a été améliorée pour obtenir de meilleures performances, la sérialisation/désérialisation en faisant partie, ce qui permet par exemple de réhydrater une application tombstonée plus rapidement. Le WebClient a aussi été revu pour ne plus forcément utiliser le thread UI tandis que le GC intervient moins fréquemment et est plus sélectif. Comme le nouveau SDK ce base sur la version 4 de Silverlight, cela ajoute de nouvelles possibilités (Flux de caméra) et de nouveaux contrôles (PathListBox, RichTextBox …) et un thread dédié à l’input a été ajouté. Enfin le décodage des images ce fait maintenant en t’che de fond.

Côté XNA les instructions SIMD sont maintenant gérées, les opérations sur les vecteurs sont parallélisées et il est même possible de combiné un développement Silverlight avec du XNA !

Cycle de vie

Le cycle de vie se voit ajouté un nouvel état nommé Dormant, quand l’utilisateur sort de l’application l’événement Deactivated est déclenché et le système met l’application dans cet état Dormant, tous les threads de l’application sont arrêtés mais l’état de la mémoire reste intact. Si l’application est réactivée la mémoire est réutilisée directement. Cependant si trop d’application sont démarrées et qu’il ne reste plus assez de mémoire, le système passe alors les applications les moins utilsées en tombstoning pour libérer la mémoire.

Lors de la réactivation d’une application on utilise IsApplicationInstancePreserved pour savoir si l’application était dans l’état Dormant ou non.

// Code to execute when the application is activated (brought to foreground)
// This code will not execute when the application is first launched
private void Application_Activated(object sender, ActivatedEventArgs e)
{
  if (e.IsApplicationInstancePreserved)
  {
    ApplicationDataStatus = "application instance preserved.";
    return;
  }

  // Check to see if the key for the application state data is in the State dictionary.
  if (PhoneApplicationService.Current.State.ContainsKey("ApplicationDataObject"))
  {
    // If it exists, assign the data to the application member variable.
    ApplicationDataStatus = "data from preserved state.";
    ApplicationDataObject = PhoneApplicationService.Current.State["ApplicationDataObject"] as string;
  }
}

Background Audio Agent

Il est enfin possible de d’écouter de la musique en fond ! Youpi.

Le système va utiliser l’instance de Zune pour cela et on ne pourra bien sûr avoir qu’un seul morceau lut à la fois. Pour créer ce type d’application un template de projet a été ajouté : Windows Phone Audio Playback Agent On va utiliser le namespace Microsoft.Phone.BackgroundAudio et plus exactement le singleton BackgroundAudioPlayer.Instance qui correspond à Zune.

On peut alors fournir un objet AudioTrack à cette instance puis la contrôler (play, pause, Rewind, SkipNext, SkipPrevious, Stop , FastForward) et s’abonner à son changement d’état PlayStateChanged pour par exemple savoir quand la piste audio se termine pour exécuter une autre action.

Astuce : Dans l’émulateur appuyez sur F10 pour afficher le lecteur zune.

Background Transfert

Le second background agent introduit avec Mango est le BackgroundTransferService qui permet comme son nom l’indique de transférer des fichiers par réseau même si l’application n’est pas en cours d’exécution. De plus il est possible de planifier les transferts, de connaitre leur progression et de gérer la file d’attente.

Toutes les API liée à cette fonctionnalité se trouve dans le namespace Microsoft.Phone.BackgroundTransfer:

A noté quelques limitations :

Voici un exemple de code.

BackgroundTransferRequest btr = new BackgroundTransferRequest (new Uri (serviceUploadLocationURL + localDBName,UriKind.Absolute));
 btr.TransferPreferences = TransferPreferences.AllowBattery;
btr.Method = "POST";
btr.UploadLocation = new Uri("/" + TransfersFiles + "/" + localDBName, UriKind.Relative);
btr.TransferStatusChanged += new EventHandler<BackgroundTransferEventArgs>(btr_UploadTransferStatusChanged);
btr.TransferProgressChanged +=  new EventHandler<BackgroundTransferEventArgs>(
btr_TransferProgressChanged);
Microsoft.Phone.BackgroundTransfer.BackgroundTransferService.Add(btr);

ScheduledTask Agent

Pour finir avec les t’ches de fond, il est aussi possible d’écrire un bout de code à exécuter en tant que t’che planifiée.

Il existe deux types de t’ches planifiées et donc une classe héritant de ScheduledTask pour chacun de ces types : PeriodicTask et ResourceIntensiveTask

La différence c’est que la t’che périodique s’exécute régulièrement pendant un court instant et ne consomme peu de ressources alors que la t’che intensive elle s’exécute moins souvent mais consomme plus et plus longtemps.

Les limitations sont les suivantes :

Voici un exemple de code :

Microsoft.Phone.Scheduler.PeriodicTask

PeriodicTask periodicTask = new PeriodicTask("TaskUniqueNameInApp");
periodicTask.Description = "My Periodic Task Description";
periodicTask.ExpirationTime = DateTime.Now.AddDays(10);
ScheduledActionService.Add(periodicTask);

Microsoft.Phone.Scheduler.ResourceIntensiveTask

ResourceIntensiveTask intensiveTask  new ResourceIntensiveTask("TaskUniqueNameInApp ");
intensiveTask.Description = "My Intensive Task Description";
intensiveTask.ExpirationTime = DateTime.Now.AddDays(10);
ScheduledActionService.Add(intensiveTask)

Il faut ensuite créer une classe qui hérite de ScheduledTaskAgent et surcharger la méthode OnInvoke et OnCancel

public class TaskScheduler : ScheduledTaskAgent
{
    protected override void OnInvoke(ScheduledTask task)
    {
        if (task is PeriodicTask)
        {        }
        else //is ResourceIntensiveTask
        {        }
NotifyComplete();
    }
 }

Dans le WMAppManifest.xml on retrouve l’entrée suivante :

<ExtendedTask Name="BackgroundTask">
<BackgroundServiceAgent Specifier="ScheduledTaskAgent" Name="SampleAgent"Source="#AssemblyName#" Type="#AssemblyName#.TaskScheduler" />
</ExtendedTask>

Alarm & Reminder

Deux nouveautés les alarmes et rappel que vous pouvez intégrer dans vos applications, voici un exemple de code :

Alarm

using Microsoft.Phone.Scheduler;
private void AddAlarm(object sender, RoutedEventArgs e)
{
   Alarm alarm = new Alarm("Ding dong!!!");
   alarm.BeginTime = DateTime.Now.AddSeconds(15);
   alarm.Content = "Debout la dedans!.";
   ScheduledActionService.Add(alarm);
}

rappel

using Microsoft.Phone.Scheduler;
private void AddReminder(object sender, RoutedEventArgs e)
{
   Reminder reminder = new Reminder("SoundMachineReminder")
	{
	BeginTime = DateTime.Now.AddSeconds(30),
	Content = "N'oubliez pas que vous pouvez télécharger les musiques en local",
	Title = "Sound Machine Reminder System",     	RecurrenceType = RecurrenceInterval.Yearly,     	NavigationUri = new Uri("/MainPage.xaml", UriKind.Relative)
	};
   ScheduledActionService.Add(reminder);
}

Tile & push notification

Plusieurs nouveautés concernant les tuiles :

SL4 & XNA

Il est maintenant possible d’utiliser les ces deux technologies dans la même application.

Basé sur une application Silverlight nous pouvons basculer entre les moteurs Silverlight et XNA en utilisant la méthode GraphicsDevice.SetSharingMode(). Lorsque le mode sharing est activé XNA se charge du rendu et les opérations Update et Draw sont déclenchées par des évènements de GameTimer. Le contenu Silverlight peut alors être intégré comme une texture en utilisant un UIElementRenderer.

Contacts / Calendrier

On peut maintenant accéder aux informations de l’utilisateur de façon asynchrone bien entendu et le petit plus, c’est que l’on peut aussi requêter en Linq. Retrouvez les infos complètes sur la msdn Microsoft.Phone.UserData

Launchers / Choosers Quelques nouvelles task ont été rajoutées pour nous simplifier la vie.

Caméra

Il va maintenant être possible de créer des applications de réalité augmentée par l’utilisation de la caméra ! On dispose de deux API, une propre au téléphone PhotoCamera qui permet entre autre de gérer le flash, le focus … et l’API WebCam de SL4 qui est compatible avec celle utilisée sur PC.

Motion API

L’API Motion est une api combinant à la fois les données de l’accéléromètre, de la boussole et du gyroscope et qui permet après des calculs complexes de géométrique de déterminer ‘« l’attitude ‘» du téléphone. Cette API sera utile notamment pour les fameuses applications de réalité augmentée.

Voir l’utilisation ici

Sql Compact

Le sdk intègre maintenant une BDD SQL CE (.sdf).

La base est créée par une approche ‘« Code First ‘», autrement dit on crée un modèle par classes sur lesquelles ont rajoute des attributs comme Table ou Column. Ce modèle est ensuite utilisé au travers d’un DataContext sur lequel on fait des requêtes Linq, des insert/update/delete.

Vous trouverez un exemple complet ici

Search Extensibility

Les applications mango ont maintenant la possibilité de s’enregistrer en tant qu’application susceptible de correspondre à une recherche fait directement par Bing. Une fois l’application enregistrée, si elle a un rapport avec le terme recherché, l’application pourra directement être lancée depuis le résultat de la recherche Bing. L’application va alors se lancer en prenant en compte le terme recherché.

Pour ce faire les extensions sont déclarées dans le WMAppManifest ainsi que dans un fichier supplémentaire extras.xml un fichier.

Plus d’informations ici

Network

Windows Phone OS 7.1 inclut de nouvelles API réseau basé sur les sockets. Les protocols TCP et UDP(unicast et multicast) sont supportés. http://msdn.microsoft.com/en-us/library/hh202870(v=VS.92).aspx

De plus DeviceNetworkInformation a été complété pour faciliter l’utilisation et tester rapidement la connectivité.

Marcketplace

Il sera possible de distribuer une application beta à un ensemble de testeur (100 max) avant certification. Le processus est le suivant : le développeur fourni une liste de testeurs, il reçoit un lien deeplink qu’il transfert, les testeurs ont alors 90 jours pour renvoyer leur feedback.

Il sera aussi possible d’utiliser un service de diffusion privée toujours sur le même principe un lien sera fourni au développeur de l’application qui ne sera pas visible directement sur le marketplace. Il suffira alors de donner le lien aux différents clients.