[WP7] Tombstoning o que hacer cuando nos llaman al movil

Como ya sabréis el cambio en la forma de desarrollar aplicaciones para Windows Phone 7 ha sido bastante radical con respecto a como se hacía en Windows Mobile 6.5. Ahora tenemos que seguir unas guías de estilo, tener en cuenta los botones del dispositivo, el contenido del programa, etc,. Pues bien, una de las diferencias más notables que podemos encontrar es la imposibilidad de correr mas de una aplicación al mismo tiempo, no hay manera de cambiar de una aplicación a otra  sin cerrar la primera (siempre que la aplicación no sea nativa del sistema). Aquí voy a aclarar una expresión que ha llevado a muchas discusiones / criticas, que es: ¿¡Windows Phone 7 no proporciona multitarea!? la respuesta es por un lado “no”, no nos permite a los desarrolladores en general mantener nuestras aplicaciones en segundo plano al estilo de WM6.5 y por otro lado “si”, si permite multitarea pero lo restringe a las aplicaciones propias del sistema operativo (y supongo que a las aplicaciones de terceros a los que Microsoft de su consentimiento). ¿Por que han hecho esto así? bueno pues básicamente para dar más agilidad a la máquina y que no se produzca un desperdicio de recursos en el aparato, además disponemos de mecanismos como las notificaciones para avisar al usuario de cambios o actualizaciones de los datos de nuestro programa. Esta restricción de la multitarea no solo es idea de Microsoft, antes que ellos ya la ha practicado Apple con su IPhone. En Android por ejemplo esta faceta no se controla, dejando al desarrollador al cuidado de estas tareas. Pero vamos al tema del post de hoy “tombstoning”, como ya he dicho solo podemos tener ejecutándose una aplicación al mismo tiempo sin contar con las del sistema y además existen situaciones en las cuales el sistema se “apropia” de la pantalla, como es en el caso de las llamadas de teléfono. Cuando nos llaman al teléfono la aplicación que tenemos en pantalla se cierra inmediatamente y no tenemos opción de guardar la información con la que trabajábamos en ese momento. Para estos casos tenemos el “tombstoning”, que nos permite programar el guardado automático de la información del programa cuando el sistema o nosotros detenemos su ejecución. Disponemos de algunos eventos para guardar o cargar nuestros datos, estos son:

  • Launching
  • Activated
  • Closing
  • Deactivated

Launching y Closing se producen cuando lanzamos la aplicación y cuando la cerramos, por otro lado disponemos de Activated y Deactivated que suceden cuando nos llaman al teléfono o pulsamos el botón de Volver. Voy a mostrar un ejemplo en el que persisto el texto de un textbox y donde muestro la hora a la que se desactivo la aplicación. Lo primero de todo es abrir Visual Studio y elegir un nuevo proyecto de tipo “Windows Phone Application”

Lo creamos y abrimos la clase App.xaml.cs, aproximadamente a la mitad de la clase podemos ver los eventos que os comentaba arriba. Bueno ponemos el cursor del ratón en el evento Deactivated y haciendo uso de PhoneApplicationService guardamos la hora en la que el programa se interrumpe por una llamada: [sourcecode language=’c#’] privatevoid Application_Deactivated(object sender, DeactivatedEventArgs e) { PhoneApplicationService.Current.State[«desactivadoHora»] = DateTime.Now; } [/sourcecode] Ahora abrimos MainPage.xaml, veremos algo como esto:

Tenemos que añadir a la interfaz un TexBox y un TexBlock para que quede de la siguiente forma:

 

<Grid x:Name=»LayoutRoot» Background=»Transparent»>
<Grid.RowDefinitions>
<RowDefinition Height=»Auto»/>
<RowDefinition Height=»*»/>
</Grid.RowDefinitions>

<!–TitlePanel contains the name of the application and page title–>
<StackPanel x:Name=»TitlePanel» Grid.Row=»0″ Margin=»12,17,0,28″>
<TextBlock x:Name=»ApplicationTitle» Text=»MY APPLICATION» Style=»{StaticResource PhoneTextNormalStyle}»/>
<TextBlock x:Name=»PageTitle» Text=»page name» Margin=»9,-7,0,0″ Style=»{StaticResource PhoneTextTitle1Style}»/>
</StackPanel>

<!–ContentPanel – place additional content here–>
<Grid x:Name=»ContentPanel» Grid.Row=»1″ Margin=»12,0,12,0″>
<TextBox Height=»279″ HorizontalAlignment=»Left» Margin=»36,50,0,0″ Name=»textBox1″ Text=»» VerticalAlignment=»Top» Width=»384″ TextChanged=»textBox1_TextChanged»/>
<TextBlock Height=»57″ HorizontalAlignment=»Left» Margin=»36,361,0,0″ Name=»textBlock1″ Text=»» VerticalAlignment=»Top» Width=»389″/>
</Grid>
</Grid>

Ahora en el evento TextChanged del TextBox añadimos la siguiente línea:

[sourcecode language=’c#’]

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
PhoneApplicationService.Current.State[«textoEscrito»] = textBox1.Text;
}

[/sourcecode]

De esta manera guardamos el texto cada vez que cambia. Cuando el programa se ve interrumpido por la llamada de teléfono y volvemos a la aplicación MainPage llama automáticamente al método OnNavigatedTo  (este evento ocurre cada vez que se carga una clase que deriva de Page). Nosotros lo sobrescribimos para que cuando se ejecute cargue los datos que hemos guardado anteriormente:

[sourcecode language=’c#’]

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
if (PhoneApplicationService.Current.State.ContainsKey(«textoEscrito»))
{
textBox1.Text = (string)PhoneApplicationService.Current.State[«textoEscrito»];
}

if (PhoneApplicationService.Current.State.ContainsKey(«desactivadoHora»))
{
textBlock1.Text =»La aplicación se desactivo a las:»;
textBlock1.Text += ((DateTime)PhoneApplicationService.Current.State[«desactivadoHora»]).TimeOfDay.ToString();
}
else
{
textBlock1.Text=»»;
}
}

[/sourcecode]

Simplemente tenemos que comprobar que existen las claves que indicamos y en caso afirmativo mostrar la información. Ahora ejecutamos el programa e introducimos texto en el TextBox, para simular la llamada de teléfono o que abrimos otro programa pulsamos la tecla de Windows.

 

Cuando queramos ir hacia atrás, pulsamos la tecla de Volver y veremos una pantalla en la que se está recuperando la información:

Por último aquí podéis ver la información recuperada y la hora a la que el programa quedo inactivo. Espero que os sirva a todos los que estáis programando en WP7, el código lo tenéis aquí.

Saludos Sonrisa