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

31 Tage Mango | Tag #3: Alarme und Erinnerungen

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

Der Ori­gi­nal­ar­ti­kel befin­det sich hier: Day #3: Alarms and Remin­ders.

Heu­te dis­ku­tie­ren wir, wie wir Alar­me und Erin­ne­run­gen auf dem Gerät eines Benut­zers set­zen kön­nen. Erin­ne­run­gen kön­nen kom­plett von der Anwen­dung ver­wal­tet wer­den, d.h. wir kön­nen Erin­ne­run­gen nach Bedarf erstel­len, bear­bei­ten und löschen.

Wie Erinnerungen funktionieren

Erin­ne­run­gen auf Win­dows Pho­ne sind ein Weg, den Benut­zer an eine zu erle­di­gen­de Auf­ga­be zu erin­nern. Offen­sicht­li­che Anwen­dungs­fäl­le für Erin­ne­run­gen sind Wecker, Kalen­der, oder eine To-Do Lis­te. Erin­ne­run­gen kön­nen jedoch für eine Viel­zahl von Anwen­dun­gen ver­wen­det wer­den — bei­spiels­wei­se um den Benut­zer zu erin­nern, zu Ihrer Anwen­dung zurück­zu­keh­ren. Hier ist ein Bei­spiel für eine Erin­ne­rung, die Sie auf dem Tele­fon des Benut­zers aus­lö­sen kön­nen:

Wie man eine Erinnerung erstellt

Eine Erin­ne­rung zu erstel­len ist rela­tiv ein­fach. Man erstellt ein Objekt vom Typ Remin­der, setzt die Eigen­schaf­ten um das gewünsch­te Ver­hal­ten zu erlan­gen und fügt es dem auf dem Tele­fon lau­fen­den Sche­du­le­dAc­tion­Ser­vice hin­zu. Unten ist der kom­plet­te Quell­code für eine voll funk­ti­ons­fä­hi­ge Erin­ne­rung (und zwar die oben in dem Screen­shot). Nach dem gesam­ten Code gehen wir auf die ein­zel­nen Details ein. Bit­te beach­ten Sie, dass ich im Quell­code oben ein zusätz­li­ches using State­ment hin­zu­ge­fügt habe: Microsoft.Phone.Scheduler.

using System;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Scheduler;

namespace Day3_Reminders
{
   public partial class MainPage : PhoneApplicationPage
   {
      // Constructor
      public MainPage()
      {
         InitializeComponent();

         Reminder r = new Reminder("testreminder");
         r.Title = "A Special Reminder";
         r.Content = "Jeff Blankenburg's Reminder";
         r.NavigationUri = new Uri("/ReminderPage.xaml", UriKind.Relative);
         r.BeginTime = DateTime.Now.AddSeconds(15);
         r.ExpirationTime = DateTime.Now.AddDays(7);
         r.RecurrenceType = RecurrenceInterval.Daily;

         ScheduledActionService.Add(r);
      }
   }
} 

Die Erinnerung benennen

Zunächst ist es erfor­der­lich, dem Remin­der einen Namen zu geben. Im obi­gen Bei­spiel heißt er ein­fach „testre­min­der“. Jeder Remin­der (und jeder Alarm, sie­he wei­ter unten) muss einen Namen haben. Die­ser Name kann benutzt wer­den, um Remin­ders spä­ter zu ver­wal­ten. Der Name eines Reminders/Alarms muss ein­deu­tig sein — berück­sich­ti­gen Sie das, wenn Sie Ihre Anwen­dung ent­wi­ckeln. Wenn der Name kei­ne Rol­le spielt und Sie spä­ter nicht mehr auf den Remin­der zugrei­fen müs­sen, kön­nen Sie z.B. einen ein­fa­chen Zeits­tem­pel als Namen ver­wen­den. Dadurch soll­te jedes Mal ein ein­deu­ti­ger Name sicher­ge­stellt sein.

App Name, Title und Content

Durch die­se Wer­te kann man bestim­men, wel­che Nach­richt in der Benach­rich­ti­gung an den Benut­zer ange­zeigt wer­den soll. Im unten ste­hen­den Screen­shot habe ich jedes der Text­fel­der ent­spre­chend mar­kiert.

Wie Sie sehen, kön­nen wir nicht beein­flus­sen wie der Text dar­ge­stellt wird. Wir bekom­men aber genü­gend Platz um eine Nach­richt dar­zu­stel­len. Wenn der Benut­zer auf irgend­ei­nen Bereich der Benach­rich­ti­gung tippt, haben wir über die Eigen­schaft Navi­ga­ti­o­nUri die Mög­lich­keit, ihn wie­der in die Anwen­dung zu brin­gen.

NavigationUri

Die Navi­ga­ti­o­nUri ist ein rela­ti­ver Pfad zu einer Sei­te Ihrer Anwen­dung. Im obi­gen Code­bei­spiel schi­cken wir den Benut­zer zur ReminderPage.xaml. Die­ses Kon­zept wird auch „deep lin­king“ genannt. Sie wer­den es in vie­len der neu­en APIs für Win­dows Pho­ne 7.5 fin­den. Die Mög­lich­keit, eine bestimm­te Sei­te der Anwen­dung zu star­ten wird sich als sehr nütz­lich erwei­sen — sowohl für den Benut­zer als auch für Sie. Ich emp­feh­le Ihnen wärms­tens, von die­ser Fähig­keit Gebrauch zu machen.

BeginTime, ExpirationTime und RecurrenceType

Begin­Ti­me ist offen­sicht­lich eine sehr wich­ti­ge Eigen­schaft, da hier­mit bestimmt wird, wann die Erin­ne­rung auf dem Gerät des Benut­zers gestar­tet wird. Man über­gibt hier einen DateTime Wert, genau wie bei Expi­ra­ti­on­Ti­me. Der Wert Expi­ra­ti­on­Ti­me ist nicht zwin­gend erfor­der­lich — er wird rele­vant und nütz­lich, wenn wir wie­der­ho­len­de Erin­ne­run­gen rea­li­sie­ren. Viel­leicht wol­len Sie Ihren Anwen­der jeden Tag um 13:00 Uhr dar­an erin­nern, sei­nen Blut­zu­cker zu über­prü­fen, dies jedoch nur für eine Woche. In die­sem Fall wür­den Sie Expi­ra­ti­on­Ti­me auf eine Woche nach Beginn fest­le­gen und den Recur­ren­ce­Ty­pe = RecurrenceInterval.Daily set­zen. Dadurch wird die sel­be Erin­ne­rung jeden Tag an den Benut­zer geschickt. Um meh­re­re Erin­ne­run­gen pro Tag zu rea­li­sie­ren, kön­nen Sie meh­re­re unter­schied­li­che Remin­der Objek­te erstel­len. Dies führt uns zur nächs­ten Her­aus­for­de­rung: wie ver­wal­tet man all die unter­schied­li­chen Erin­ne­run­gen?

Bestehende Erinnerungen verwalten

Eine Erin­ne­rung zu erstel­len ist ein­fach. Vie­le exis­tie­ren­de Erin­ne­run­gen zu ver­wal­ten kann aber schnell kom­pli­ziert wer­den. Wenn Sie den Bei­spiel­code oben ver­wen­det haben, sind sie mög­li­cher­wei­se einer Inva­l­idOpe­ra­tionEx­cep­ti­on begeg­net, die besagt, dass der betref­fen­de Remin­der bereits exis­tiert. Dar­um ist es bei der Erstel­lung eines Remin­ders sehr wich­tig zu prü­fen, ob Sie die­sen nicht bereits ange­legt haben. Hier­zu kön­nen wir nach einem bekann­ten Remin­der-Namen suchen und ihn gege­be­nen­falls löschen. Der unten ste­hen­de Code ist genau der sel­be wie oben mit dem Unter­schied, dass geprüft wird, ob der Remin­der bereits exis­tiert. Wenn ja, wird er gelöscht.

using System;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Scheduler;

namespace Day3_Reminders
{
   public partial class MainPage : PhoneApplicationPage
   {
      // Constructor
      public MainPage()
      {
         InitializeComponent();

         if (ScheduledActionService.Find("testreminder") != null)
            ScheduledActionService.Remove("testreminder");
            
         Reminder r = new Reminder("testreminder");
         r.Title = "A Special Reminder";
         r.Content = "Jeff Blankenburg's Reminder";
         r.NavigationUri = new Uri("/ReminderPage.xaml", UriKind.Relative);
         r.BeginTime = DateTime.Now.AddSeconds(15);
         r.ExpirationTime = DateTime.Now.AddDays(7);
         r.RecurrenceType = RecurrenceInterval.Daily;

         ScheduledActionService.Add(r);
      }
   }
} 

Die Mög­lich­keit, spe­zi­el­le Erin­ne­run­gen und Alar­me zu fin­den, ist sehr nütz­lich wenn Sie einen zuvor erstell­ten Remin­der bear­bei­ten oder ändern müs­sen. Um einen Remin­der zu bear­bei­ten kön­nen Sie die Find() Metho­de ver­wen­den um eine Refe­renz auf das Remin­der Objekt zu bekom­men. Mit der Replace() Metho­de kön­nen Sie einen aktua­li­sier­ten Remin­der spei­chern. Der fol­gen­de Code illus­triert das:

if (ScheduledActionService.Find("testreminder") != null)
{
   Reminder r = ScheduledActionService.Find("testreminder") as Reminder;
   r.Title = "This has been edited.";
   r.Content = "This is updated content.";
   r.BeginTime = DateTime.Now.AddSeconds(15);

   ScheduledActionService.Replace(r);
} 

Wie man einen Alarm erstellt

Alar­me sind fast iden­tisch zu Erin­ne­run­gen. Es gibt aller­dings klei­ne aber ent­schei­den­de Unter­schie­de: Alar­me haben kei­ne Tit­le Eigen­schaft und Alar­me kön­nen kei­ne Navi­ga­ti­o­nUri fest­le­gen. Alar­me kön­nen hin­ge­gen einen selbst­de­fi­nier­ten Ton abspie­len, etwas, das Remin­der nicht kön­nen. Abge­se­hen von die­sen Unter­schie­den sind Alar­me und Erin­ne­run­gen iden­tisch. Wir ver­wal­ten Sie auf die sel­be Art und Wei­se (mit­tels des Sche­du­le­dAc­tion­Ser­vice), indem wir Alar­me je nach Bedarf hin­zu­fü­gen, modi­fi­zie­ren und löschen. Hier ist etwas Bei­spiel­code, um einen Alarm zu erstel­len. Dabei grei­fen wir im Wesent­li­chen auf das Wis­sen über Remin­ders zurück:

if (ScheduledActionService.Find("testalarm") != null)
ScheduledActionService.Remove("testalarm");

Alarm a = new Alarm("testalarm");
a.Content = "Jeff Blankenburg's Alarm";
a.Sound = new Uri("button-8.mp3", UriKind.Relative);
a.BeginTime = DateTime.Now.AddSeconds(15);
a.ExpirationTime = DateTime.Now.AddDays(7);
a.RecurrenceType = RecurrenceInterval.Daily;

ScheduledActionService.Add(a); 

Wie Sie sehen, ist sogar die Syn­tax iden­tisch zu der Erstel­lung eines Remin­ders. Bei der Eigen­schaft Sound refe­ren­zie­re ich eine MP3 Datei, die ich mei­nem Pro­jekt hin­zu­ge­fügt habe. Wie man Audio-Datei­en zum Pro­jekt hin­zu­fü­gen kann und die­se z.B. bei einem Klick-Event abspielt, ist in Day #20 of my 31 Days of Sil­ver­light beschrie­ben. Lesen Sie die­sen Arti­kel, wenn Sie mehr Info­ma­tio­nen dar­über benö­ti­gen.

Zusammenfassung

Erin­ne­run­gen und Alar­me sind eine groß­ar­ti­ge Mög­lich­keit, den Benut­zer über eine anste­hen­de Auf­ga­be zu infor­mie­ren. Auch wenn sie sich stark ähneln, soll­ten Sie in Erin­ne­rung behal­ten, dass Remin­ders Ihnen erlau­ben, ein Link zurück in die Anwen­dung — sogar zu einer spe­zi­el­len Sei­te — fest­zu­le­gen. Dies ist eine effek­ti­ve Mög­lich­keit, den Benut­zer wie­der in Ihre Anwen­dung zurück­zu­ho­len. Für den Benut­zer ist es gleich­zei­tig eine her­vor­ra­gen­de Mög­lich­keit, schnell zu den Infor­ma­tio­nen zu kom­men, die für ihn gera­de wich­tig sind.

Um eine kom­plett lauf­fä­hi­ge Anwen­dung mit dem gan­zen Code die­ses Arti­kels zu sehen, kli­cken Sie auf das „Down­load Code“ Sym­bol unten.

Mor­gen wer­de ich Ihnen einen mit Man­go neu ver­füg­bar gewor­de­nen Sen­sor vor­stel­len: den Kom­pass. Ich wer­de ihnen sogar zei­gen, wie er von Magne­ten beein­flusst wer­den kann. Bis dahin!

Schreibe einen Kommentar

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