Windows Phone. Recordatorios.

Vamos a comenzar la entrada recordando algo que ya vimos cuando analizamos las alarmas en esta entrada. Recordamos que en Windows Phone contamos con dos tipos de notificaciones programadas:

  • Alarmas

  • Recordatorios

Ambas son un popup que sale en la parte superior de la pantalla (podéis echarle un vistazo a las capturas de arriba). Pueden contener un texto que podemos personalizar y ambas nos permitirán dos opciones:

  • Desestimar
  • Posponer

La diferencia básica entre las alarmas y los recordatorios son:

  • Las alarmas pueden reproducir un sonido personalizado, los recordatorios no.
  • Los recordatorios puede utilizar una URL que le indiquemos (incluso usando parámetros) para redirigirnos a una página en concreto.  Al tocar encima de la alarma nos abre la aplicación pero no podemos hacer que el usuario sea guiado a una página concreta.

Recordatorios

En esta entrada vamos a centrarnos en analizar los recordatorios. Para ello, como en la mayoría de ocasiones, vamos a realizar un ejemplo prático.

Creamos un nuevo proyecto:

La plantilla seleccionada será “Windows Phone Application” para simplificar al máximo el ejemplo.

Agregamos dentro del Grid principal de la página MainPage.xaml:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
     <StackPanel Grid.Row="1" Orientation="Vertical">
          <TextBlock Text="Título:" />
          <TextBox x:Name="txtTitulo" Text="Recordatorio" />
          <TextBlock Text="Contenido:" />
          <TextBox x:Name="txtContenido" Text="Contenido del recordatorio." />
          <TextBlock Text="El recordatorio se lanzará en 5 segundos." />
          <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,25">
               <Button x:Name="btnCrear" Content="Crear" />
          </StackPanel>
     </StackPanel>
</Grid>

El resultado es el siguiente:

Hemos creado una pequeña interfaz donde permitimos al usuario modificar el texto que aparecerá en el recordatorio, le informamos que aparecerá en 5 segundos (este tiempo es totalmente personalizable, lo hemos colocado de manera fija en este ejemplo para simplificar el proceso) y añadimos un botón que será el encargado de crear el recordatorio al ser pulsado.

Agregamos a continuación el evento Click del botón:

<Button x:Name="btnCrear" Content="Crear" Click="btnCrear_Click"/>

Por último, vamos a la parte más interesante. Vamos a añadir la lógica que se ejecutará al pulsar sobre el botón (en MainPage.xaml.cs):

private void btnCrear_Click(object sender, RoutedEventArgs e)
{
     Reminder reminder = new Reminder("Recordatorio");
     reminder.Title = this.txtTitulo.Text;
     reminder.Content = this.txtContenido.Text;
     double seconds = 5.0;
     reminder.BeginTime = DateTime.Now.AddSeconds(seconds);
     reminder.ExpirationTime = reminder.BeginTime.AddSeconds(5.0);
     reminder.RecurrenceType = RecurrenceInterval.Daily;

     ScheduledActionService.Add(reminder);
}

Lo primero que hacemos es crear una instancia de un objeto Reminder indicando en el constructor el nombre del recordatorio. Es importante resaltar que el nombre del recordatorio ha de ser único. No pueden existir dos recordatorios con el mismo nombre. En caso contrario obtendríamos una excepción de tipo InvalidOperationException.

La gran diferencia con respecto a lo que vimos al trabajar con alarmas es que no podemos definir un sonido personalizado. Por contra, podemos definir el título (propiedad Title).

BeginTime, indica la fecha y hora en la cual el recordatorio comenzará. Debe ser siempre una fecha posterior a la actual.

La propiedad Content es el texto que aparecerá en el recordatorio.

RecurrenceType toma su valor de una enumeración del tipo RecurrenceType. Los valores posibles son:

  • None. No hay repetición. Solo se lanzará la alarma en la fecha y hora indicada.
  • Daily. Se lanzará todos los días a la hora indicada.
  • Weekly. Se lanzará cada semana en el día y la hora indicada.
  • Monthly. Se lanzará cada mes en el día y hora indicada.
  • Yearly. Se lanzará cada año en el día y hora indicada.
  • EndOfMonth. Esta opción es interesante. La alarma se lanzará a la hora indicada cada mes en el último día del mismo.

Como ya hemos mencionado no pueden existir dos recordatorios con el mismo nombre. Podemos mejorar el ejemplo añadiendo el siguiente código:

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

Hemos utilizado el servicio ScheduledActionService. Dicho servicio tiene un método llamado Find al que le pasaremos una cadena como parámetro que será el nombre de un recordatorio.  Si existe podemos eliminar el recordatorio para volver a crearlo sin problemas.

A continuación, vamos a utilizar el servicio ScheduledActionService para poder mostrar los recordatorios creados. Para ello, agregamos una nueva página llamada “Recordatorios.xaml”. Agregamos a dicha página el siguiente código:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
     <Grid.RowDefinitions>
          <RowDefinition Height="*" />
          <RowDefinition Height="Auto" />
     </Grid.RowDefinitions>
     <ListBox x:Name="lbRecordatorios" Grid.Row="0">
          <ListBox.ItemTemplate>
               <DataTemplate>
                    <StackPanel Height="80">
                         <TextBlock Text="{Binding Content}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                         <TextBlock Text="{Binding BeginTime}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                    </StackPanel>
               </DataTemplate>
          </ListBox.ItemTemplate>
     </ListBox>
     <Button Grid.Row="1" Content="Volver" Height="100" VerticalAlignment="Bottom" Click="Button_Click"/>
</Grid>

Para navegar de la página principal a esta página agregamos un botón a la página principal:

<Button x:Name="btnVerRecordatorios" Content="Ver Alarmas" Click="btnVerRecordatorios_Click"/>

El evento Click del botón nos guiará hacia nuestra nueva página “Alarmas.xaml”:

private void btnVerRecordatorios_Click(object sender, RoutedEventArgs e)
{
     NavigationService.Navigate(new Uri("/Recordatorios.xaml", UriKind.Relative));
}

Llegamos a la parte más interesante. Vamos a rellenar la lista que hemos añadido a nueva página “Recordatorios.xaml”. Para ello vamos a utilizar el método GetActions del servicio ScheduledActionService. Este método nos devuelve una colección de objetos con el tipo que le hayamos especificado. Sería algo asi:

IEnumerable<Reminder> recordatorios = ScheduledActionService.GetActions<Reminder>();
this.lbRecordatorios.ItemsSource = recordatorios;

Como podemos ver, obtenemos una colección de recordatorios que asignamos como fuente de datos de nuestro ListBox.

Llegados a este punto hemos visto que los recordatorios son muy similares a las alarmas. En comparación con las alarmas, podemos establecerles el título y no podemos utilizar un sonido personalizado. Sin embargo, hemos dejado para el final analizar otra de sus grandes características. Contamos con una propiedad llamada NavigationUri que espera una Uri hacia una página. Cuando el usuario pulse sobre el recordatorio será guiado a la página que establecemos en esta propiedad. Además podemos pasar parámetros en la Uri utilizada.

NOTA: Debemos estar fuera de la aplicación para que al pulsar sobre el recordatorio seamos guiados a la página establecida en la propiedad NavigationUri.

Interesante, ¿verdad?. Veamos como utilizar esto. Añadimos una nueva página llamada “Recordatorio.xaml”. Será la página a la que guiaremos al usuario al pulsar sobre el recordatorio.

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
     <TextBlock x:Name="tbParametro" />
</Grid>

Ahora vamos a utilizar la propiedad NavigationUri para permitir la navegación a la nueva página creada una vez que el usuario pulse sobre el recordatorio.

string parametro = "Texto parametro";
reminder.NavigationUri = new Uri(string.Format("/Recordatorio.xaml?parametro={0}", parametro), UriKind.Relative);

Podemos incluso pasar parámetros a la página a la que se realizará la navegación. Para este ejemplo hemos utilizado una simple cadena estática para simplificar el ejemplo al máximo.

¿Cómo recuperamos el valor del parámetro en la página “Recordatorio.xaml”?

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
     base.OnNavigatedTo(e);

     string parametro = string.Empty;
     if (NavigationContext.QueryString.TryGetValue("parametro", out parametro))
          tbParametro.Text = parametro;
}

Puedes ver en video el resultado de nuestro ejemplo a continuación:

También puedes descargar el ejemplo realizado:

Nada más en esta entrada. Recordar simplemente que cualquier tipo de duda o sugerencia la podéis dejar en los comentarios. Espero que lo visto os haya sido útil.

8 pensamientos en “Windows Phone. Recordatorios.

  1. como puedo detectar si se pulso posponer o descartar en un recordatorio para poder realizar una acción determinada dependiendo de lo pulsado?

    • Buenas,

      Muy buena pregunta. Una forma de hacerlo sería:

      En la clase App.Xaml.cs puedes subscribirte a los eventos Obscured y Unobscured:

      RootFrame.Obscured += new EventHandler(RootFrame_Obscured); RootFrame.Unobscured += new EventHandler(RootFrame_Unobscured);

      Cuando salta el Popup del recordatorio, el evento RootFrame_Unobscured se lanzará; tras cerrarlo, el evento RootFrame_Obscured es lanzado. En este evento, gracias al servicio ScheduledActionService puedes consultar si el recordatorio sigue en la colección de recordatorios creados o si ha sido ya descartado.

      Espero que te sea de ayuda.

      Un saludo.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s