1

Jan

Il multitasking in Mango: Alarms & Reminders

Continuiamo a parlare di multitasking in Windows Phone Mango e questa volta ci focalizziamo su Alarms e Reminders, ovvero due nuovi classi che possiamo utilizzare per gestire avvisi e notifiche che devono essere mostrate a video anche quando la nostra applicazione è chiusa.

Il sistema operativo stesso ci mostra un esempio di entrambe le classi: quando impostiamo una sveglia andiamo a creare un Alarm, mentre quando impostiamo un promemoria per un appuntamento nel calendario creiamo un Reminder.

Innanzitutto è bene sottolineare come le classi messe a disposizione dal framework per gestire questi due tipi di promemoria siano molto simili. La maggior parte delle proprietà che permettono di configurare le notifiche sono infatti le stesse per entrambi gli oggetti, ovvero:

  • Content: la descrizione del promemoria, che viene mostrata subito sotto il titolo.
  • BeginTime: la data e l’ora in cui deve essere visualizzato il promemoria.
  • RecurrenceType: è possibile impostare una ricorrenza, nel caso in cui il promemoria debba essere ripetuto a intervalli regolari (giornalmente, mensilmente, ecc.)
  • ExpirationTime: la data e l’ora in cui il promemoria viene rimosso dallo scheduler di Windows Phone

In più, ogni promemoria è identificato da un nome specifico (che viene passato come parametro al costruttore quando l’oggetto viene inizializzato) e che deve essere univoco per la nostra applicazione: se cerchiamo di istanziare due promemoria con lo stesso nome si scatenerà un’eccezione. Questo vale non solo per Alarms e Reminders, ma anche per tutte le classi che gestiscono operazioni in background. Vedremo più avanti perchè.

Ma quali sono allora le differenze tra i due tipo di notifica?

Alarms

Gli alarms nascono per impostare delle sveglie o dei promemoria che non sono legati ad un contesto specifico della nostra applicazione, ma vogliono semplicemente ricordare qualcosa all’utente. Per questo motivo gli alarms hanno un generico titolo “Alarms”, che non è personalizzabile (la classe Alarm espone una proprietà chiamata Title, ma se cercherete di utilizzarla si scatenerà un’eccezione). Le interazioni possibili per l’utente con la notifica sono l’utilizzo dei pulsanti Snooze (per ripetere l’avviso più avanti) e Dismiss (per chiuderlo definitivamente). La classe Alarm consente inoltre di impostare un suono diverso da quello predefinito, che viene riprodotto nel momento in cui il promemoria viene visualizzato. Ciò è reso possibile dalla proprietà Sound, di tipo Uri.

Vediamo un esempio:

Alarm alarm = new Alarm(“Alarm”)
      {
      BeginTime = DateTime.Now.AddSeconds(15),
      Content = "It's time!",
      RecurrenceType = RecurrenceInterval.None
      };

      ScheduledActionService.Add(alarm);

image

Reminders

I reminders nascono invece per impostare un promemoria legato ad un contesto specifico della nostra applicazione, così come i promemoria del calendario sono legati ad un appuntamento ben preciso. Per questo scopo, espongono anche una proprietà Title (che rappresenta il titolo dell’evento che vogliamo ricordare all’utente) e, soprattutto, la proprietà NavigationUri, che permette di creare un deep link che porti l’utente ad una pagina specifica della nostra applicazione nel momento in cui fa tap sul promemoria.

Le modalità di interazione sono le stesse dell’oggetto Alarm, con in più la possibilità di impostare un tempo personalizzato per la funzione Snooze.

Vediamo un esempio:

Reminder reminder = new Reminder("Reminder")
      {
      BeginTime = DateTime.Now.AddSeconds(15),
      Title = "WhyMCA",
      Content = "Deep multitasking in Windows Phone Mango",
      ExpirationTime = DateTime.Now.AddHours(1),
      RecurrenceType = RecurrenceInterval.None,
      NavigationUri = new Uri("/MainPage.xaml?text=Deep multitasking in Windows Phone Mango", UriKind.Relative)
      };

      ScheduledActionService.Add(reminder);
image

Lo ScheduledActionService

Abbiamo visto che, in entrambi gli esempi, dopo aver istanziato il nostro oggetto lo abbiamo "aggiunto” ad un altro oggetto chiamato ScheduledActionService. Questa classe rappresenta lo scheduler di Windows Phone, che si occupa di gestire tutte le operazioni che possono essere eseguite in background. Non solo alarms e reminders, ma anche i background agents, ad esempio, passano attraverso questo scheduler.

Se andiamo ad esaminare la classe, noteremo che il metodo Add accetta oggetti di tipo ScheduledAction, che è la classe base da cui derivano tutte le classi che hanno a che fare con l’esecuzione in background (BeginTime ed ExpirationTime ad esempio, non sono proprietà specifiche delle classi Alarm e Reminder ma fanno parte proprio di ScheduledAction). Lo ScheduledActionService ci permette inoltre di scoprire se un task è già schedulato o meno (metodo Find), di rimuoverne uno (Remove) o di sostituirne uno già esistente con una nuova istanza (Replace).

Ogni ScheduledAction è identificata da un nome, che è il parametro che ad esempio viene passato al metodo Find per recuperare una specifica istanza: da ciò ne deduciamo che, all’interno della nostra applicazione, ogni ScheduledAction deve avere un nome univoco. Questo vale ovviamente per tutte le classi che ereditano da ScheduledAction: ciò significa che il limite non viene applicato solo ad oggetti dello stesso tipo (ad esempio, due istanze di Alarm con lo stesso nome) ma anche a oggetti diversi (ad esempio, una istanza di Alarm e una di Reminder con lo stesso nome).

Vedremo un utilizzo più approfondito dello ScheduledActionService quando parleremo dei background agents.

Conclusione

In allegato, trovate il progetto di esempio che ho utilizzato durante la mia sessione al WhyMCA: l’interfaccia grafica è costituita semplicemente da due pulsanti, che vanno a istanziare un Alarm e un Reminder. Per testarla, vi basta lanciarla nell’emulatore, premere uno dei due pulsanti e dopodichè uscire dall’applicazione. Dopo 15 secondi (il tempo impostato nella proprietà BeginTime), comparirà la notifica a video.

Buon download!

by Il blog di Matteo Pagani on 1/1/2012
Post archive