Georg fährt extra nach Berlin um Steve Ballmer zu treffen

31 Tage Mango | Tag #25: Background Agents

Die­ser Arti­kel ist Tag #25 der Serie 31 Tage Man­go von Jeff Blan­ken­burg.

Der Ori­gi­nal­ar­ti­kel befin­det sich hier: Day #25: Back­ground Agents.

Die­ser Arti­kel wur­de in der Ori­gi­nal­se­rie von Gast­au­tor Gary John­son geschrie­ben. Bei Twit­ter kann Gary unter @GaryGJohnson erreicht wer­den.

Heu­te schau­en wir uns eine der Fähig­kei­ten zum Mul­ti­tas­king in Win­dows Pho­ne 7.5 an. Das Gesamt­bild zum Mul­ti­tas­king besteht aus meh­re­ren neu­en Fea­tures:

  • Back­ground Agents
  • Back­ground File Trans­fer
  • Back­ground Audio Play­back
  • Sche­du­led Noti­fi­ca­ti­ons
  • Fast App­li­ca­ti­on Swit­ching

Heu­te wol­len wir Back­ground Agents näher beleuch­ten. Wäh­rend die Datei­über­tra­gung im Hin­ter­grund und das Spie­len von Audio im Hin­ter­grund spe­zi­el­le Sze­na­ri­en gut abde­cken, kann man mit die­sen Akti­vi­tä­ten kei­nen eige­nen Code aus­füh­ren. Hier kom­men Back­ground Agents ins Spiel.

Es gibt zwei ver­schie­de­ne Arten von Back­ground Agents: Perio­dic (peri­odisch aus­ge­führt) und Resour­ce Inten­si­ve (res­sour­cen­hung­rig). Res­sour­cen­hung­ri­ge Hun­ter­grund­auf­ga­ben sind gedacht für Akti­vi­tä­ten, die einen gro­ßen Ver­brauch an Sys­tem­res­sour­cen haben. Für die­se Hin­ter­grund­auf­ga­ben gibt es eini­ge Beschrän­kun­gen hin­sicht­lich des Aus­füh­rungs­zeit­punkts. Peri­odi­sche Hin­ter­grund­auf­ga­ben lau­fen öfter und mit weni­ger Ein­schrän­kun­gen. Sie sind aber nur geeig­net für Akti­vi­tä­ten, die sehr leicht­ge­wich­tig sind. Um die Vor- und Nach­tei­le der bei­den Arten zu ver­ste­hen, emp­feh­le ich Ihnen die­sen MSDN Arti­kel.

Eine peri­odi­sche Hin­ter­grund­auf­ga­be führt eine sehr kurz dau­ern­de und unauf­wän­di­ge Akti­vi­tät aus, wie zum Bei­spiel einen RSS Feed her­un­ter­zu­la­den oder den Live Tile aktua­li­sie­ren. Eine res­sour­cen­in­ten­si­ve Hin­ter­grund­auf­ga­be macht etwas, das län­ger dau­ert und viel Band­brei­te ver­braucht, wie zum Bei­spiel Syn­chro­ni­sie­rung oder Zwi­schen­spei­che­rung gro­ßer Daten­men­gen eines Cloud Diens­tes.

Wir wer­den heu­te eine peri­odi­sche Hin­ter­grund­auf­ga­be bau­en, die auf dem Live Tile die Uhr­zeit der letz­ten Aus­füh­rung anzeigt.

Erste Schritte

Star­ten Sie das Visu­al Stu­dio und erstel­len Sie ein neu­es Pro­jekt. Wäh­len Sie Win­dows Pho­ne App­li­ca­ti­on aus Sil­ver­light for Win­dows Pho­ne. Nen­nen Sie die Anwen­dung „MyAgen­tApp“.

Unse­re Haupt­an­wen­dung wird für zwei Din­ge zustän­dig sein.

  1. Sie hat einen Live Tile, den der Back­ground Agent mit Infor­ma­tio­nen aktua­li­sie­ren kann.
  2. Sie wird den Back­ground Agent star­ten und anhal­ten.

Der Back­ground Agent wird in sei­nem eige­nen spe­zi­el­len Pro­jekt leben. Fügen Sie ein neu­es Pro­jekt zu Ihrer Solu­ti­on hin­zu und wäh­len Sie hier­für die Vor­la­ge Win­dows Pho­ne Sche­du­led Task Agent. Nen­nen Sie das Pro­jekt MyAgent. Die­ses Pro­jekt wird den Code ent­hal­ten, der von der Hin­ter­grund­auf­ga­be aus­ge­führt wird und unse­ren Live Tile aktua­li­siert.

Damit die Haupt­an­wen­dung die Hin­ter­grund­auf­ga­be auch kennt, fügen wir im Pro­jekt MyAgen­tApp eine Pro­jekt­re­fe­renz auf das Pro­jekt MyAgent hin­zu. Damit kön­nen wir die Hin­ter­grund­auf­ga­be aus unse­rer Anwen­dung regis­trie­ren. Beach­ten Sie auch, dass hier­bei ein Ein­trag in der Datei WMAppManifest.xml erstellt wird:

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

Erstellung der Anwendung

Jetzt wer­den wir alles ent­spre­chend ver­ka­beln. Öff­nen Sie die MainPage.xaml und fügen Sie zwei But­tons hin­zu — einen, um den Agen­ten zu star­ten und einen, um ihn anzu­hal­ten:

<StackPanel VerticalAlignment="Center"> 
   <Button Content="Start Background Agent" 
      Click="StartButton_Click"/> 
   <Button Content="Stop Background Agent" 
      Click="StopButton_Click"/>  
</StackPanel> 

In der MainPage.xaml.cs ver­drah­ten wir die But­tons zum Star­ten und Anhal­ten der Hin­ter­grund­auf­ga­be:

private const string TASK_NAME = "MyAgent"; 

private void StartButton_Click(object sender, RoutedEventArgs e) 
{ 
    StartAgent(); 
} 

private void StopButton_Click(object sender, RoutedEventArgs e) 
{ 
    StopAgentIfStarted(); 
} 

private void StartAgent() 
{ 
    StopAgentIfStarted(); 

    PeriodicTask task = new PeriodicTask(TASK_NAME); 
    task.Description = "This is our custom agent for Day 25 - Background Agents"; 
    ScheduledActionService.Add(task); 
#if DEBUG 
    // If we're debugging, attempt to start the task immediately 
    ScheduledActionService.LaunchForTest(TASK_NAME, new TimeSpan(0, 0, 1)); 
#endif 
} 

private void StopAgentIfStarted() 
{ 
    if (ScheduledActionService.Find(TASK_NAME) != null) 
    { 
        ScheduledActionService.Remove(TASK_NAME); 
    } 
} 

Beach­ten Sie, dass wir zur Erstel­lung der Hin­ter­grund­auf­ga­be einen neu­en Perio­dic­Task anle­gen. Wir nut­zen den Namen der Hin­ter­grund­auf­ga­be als Iden­ti­fi­ka­tor, wenn wir die Auf­ga­be star­ten oder anhal­ten wol­len. Beach­ten Sie wei­ter­hin, dass wir eine PeriodicTask.Description ange­ge­ben haben. Dies ist ein erfor­der­li­ches Feld und wird im Han­dy unter Ein­stel­lun­gen > Hin­ter­grund­auf­ga­ben unter dem Namen Ihrer Anwen­dung ange­zeigt.

Erstellung der Hintergrundaufgabe

Im Pro­jekt MyAgent öff­nen Sie die Datei ScheduledAgent.cs und fügen Sie den fol­gen­den Code hin­zu:

protected override void OnInvoke(ScheduledTask task) 
{ 
   UpdateAppTile(GetLastUpdatedTimeMessage()); 
} 

private string GetLastUpdatedTimeMessage() 
{ 
   return string.Format("Last Updated: {0}", DateTime.Now); 
} 

private void UpdateAppTile(string message) 
{ 
   ShellTile appTile = ShellTile.ActiveTiles.First(); 
   if (appTile != null) 
   { 
      StandardTileData tileData = new StandardTileData 
      { 
         BackContent = message 
      }; 

      appTile.Update(tileData); 
   } 
} 

Der Sche­du­le­dAgent hat eine wich­ti­ge Metho­de, die über­la­den wer­den muss — OnIn­vo­ke. An die­ser Stel­le wird die Hin­ter­grund­auf­ga­be ihre Akti­on aus­füh­ren. Sobald die Akti­on erfolg­reich abge­schlos­sen wur­de und die Hin­ter­grund­auf­ga­be nicht mehr lau­fen muss, kön­nen Sie Noti­f­y­Com­ple­te() auf­ru­fen. Wenn Sie die Akti­on abbre­chen wol­len, rufen Sie Abort() auf um zu signa­li­sie­ren, dass Sie die Hin­ter­grund­auf­ga­be abbre­chen. Um die Hin­ter­grund­auf­ga­be wei­ter­hin peri­odisch aus­zu­füh­ren, rufen sie ein­fach kei­ne der bei­den Metho­den — genau das machen wir in unse­rem Fall.

Die Anwendung ausführen

Die Anwen­dung ist jetzt bereit zur Aus­füh­rung. Instal­lie­ren Sie die Anwen­dung im Emu­la­tor oder auf einem Gerät und füh­ren Sie sie aus. Kli­cken Sie den But­ton zum Star­ten der Hin­ter­grund­auf­ga­be. Ver­las­sen Sie die Anwen­dung und suchen Sie sie in der Anwen­dungs­lis­te. Drü­cken und hal­ten Sie die Anwen­dung und wäh­len Sie „Auf Start­sei­te“. Wenn Sie die Kachel der Anwen­dung eine Wei­le betrach­ten, soll­te die­se sich irgend­wann umdre­hen und den Zeit­punkt der letz­ten Aktua­li­sie­rung anzei­gen.

Zusammenfassung

So, heu­te haben wir unse­re eige­ne Hin­ter­grund­auf­ga­be zur Aktua­li­sie­rung des Live Tiles erstellt. Wenn Sie sel­ber Hin­ter­grund­auf­ga­ben erstel­len, den­ken Sie an das fol­gen­de:

  • Hin­ter­grund­auf­ga­ben erlau­ben Ihnen die Aus­füh­rung von Code auch wenn die Anwen­dung selbst nicht läuft.
  • Es gibt zwei Arten von Hin­ter­grund­auf­ga­ben — peri­odi­sche und res­sour­cen­in­ten­si­ve.
  • Peri­odi­sche Auf­ga­ben sind für Akti­vi­tä­ten, die wenig Res­sour­cen ver­brau­chen. Für die­se Auf­ga­ben gibt es weni­ger Beschrän­kun­gen als für res­sour­cen­in­ten­si­ve Auf­ga­ben.
  • Hin­ter­grund­auf­ga­ben brau­chen ihr eige­nes Pro­jekt. Die­ses soll­te per Pro­jekt­re­fe­renz dem Anwen­dungs­pro­jekt bekannt gemacht wer­den, wel­ches die Hin­ter­grund­auf­ga­be star­tet.
  • In der Hin­ter­grund­auf­ga­be müs­sen Sie OnIn­vo­ke() über­la­den.
  • Wenn die Hin­ter­grund­auf­ga­be abge­schlos­sen wur­de, müs­sen Sie Noti­f­y­Com­ple­te() oder Abort() auf­ru­fen.

Um ein kom­plet­tes Win­dows Pho­ne Pro­jekt mit dem Code von oben her­un­ter­zu­la­den, kli­cken Sie auf den Down­load Code But­ton unten:

Mor­gen schau­en wir uns mit Back­ground File Trans­fer ein wei­te­res Mul­ti­tas­king-Fea­ture an. Damit kön­nen wir Datei­en hoch- und her­un­ter­la­den, auch wenn die Anwen­dung nicht läuft.

Bis dahin!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert