Tombstone para Windows Phone no es el deporte de saltar al mar desde un acantilado
En Windows Phone hablamos de el en Windows Phone 7 – Tutorial III–Modelo de Ejecución. En Windows Phone solo se permite una aplicación corriendo a la vez, todavía no hay la multitarea aunque la prometen en la siguiente versión a principios del año que viene, por ahora nos conformaremos con que nuestras aplicaciones no tiene multitarea.
Si abrimos el fichero app.xaml.cs vemos que tenemos 4 métodos vacíos pero que van a ser importantes para entender el concepto de Tombstoning, estos métodos son:
- Application_Launching
- Application_Activated
- Application_Deactivated
- Application_Closing
Utilizaremos la aplicación que hemos hecho en el articulo sobre Launchers, vamos a introducir en estos métodos una traza para ver cuando se lanzan, para esta traza utilizaremos la clase Debug
Debug.WriteLine("Debug Application_Launching:" + DateTime.Now.ToLongTimeString());
- Si ejecutamos la aplicación y pulsamos al botón la flecha de retroceso del teléfono, las trazas que se generan son
Debug Application_Launching:7:22:38 PM
Debug Application_Closing:7:22:45 PM
Se ha ejecutado el evento de Close al pulsar la flecha de retroceso desde la primera pantalla de la aplicación.
- Ahora vamos a pulsar la tecla de Windows del teléfono, las trazas generadas son:
Debug Application_Launching:7:25:25 PM
Debug Application_Deactivated:7:25:40 PM
Se ha ejecutado en este caso el evento Deactivate en vez de Close
- Si ahora lanzamos un Launcher de la aplicación
Debug Application_Launching:7:30:36 PM
Debug Application_Deactivated:7:30:47 PMSe han ejecutado los mismo eventos que pulsando la tecla de Windows
Es decir nuestra aplicación es cerrada cuando el usuario desde la primera pagina de la aplicación pulsa la flecha de retroceso, en ese momento se cierra la aplicación, en los demás casos la aplicación se desactiva pudiéndose reactivar, este ultimo procesos de desactivación/reactivación es el llamado Tomnstoning, que podemos ver en la figura de abajo.
Justo antes de desactivar la aplicación podremos salvar el estado de la misma para que cuando se vuelva a activar mostremos al usuario la aplicación tal y como la había dejado. La idea es ayudar a la aplicación a dar la sensación de que ha continuado ejecutando como si nada a pesar de que fue, en efecto, eliminada temporalmente.
Para guardar el estado a la hora de desactivarse no utilizaremos el IsolatedStorage que vimos en el anterior post. Windows Phone nos proporciona la clase PhoneApplicationService.que tiene la propiedad Current y a su vez la propiedad State que es un diccionario al estilo de IsolatedStorageSettings donde guardaremos pares de clave/valor en el evento Deactivate para luego en el Activate recuperar los valores.
El código seria muy sencillo
1 private void Application_Activated(object sender, ActivatedEventArgs e) 2 { 3 Debug.WriteLine("Debug Application_Activated:" + DateTime.Now.ToLongTimeString()); 4 IDictionary<string, object> state = PhoneApplicationService.Current.State; 5 if (state.ContainsKey("DateDeactivate")) 6 { 7 Debug.WriteLine("El valor de DateDeactivate:" + state["DateDeactivate"]); 8 } 9 } 10 11 // Code to execute when the application is deactivated (sent to background) 12 // This code will not execute when the application is closing 13 private void Application_Deactivated(object sender, DeactivatedEventArgs e) 14 { 15 string dateDeactivate = DateTime.Now.ToLongTimeString(); 16 Debug.WriteLine("Debug Application_Deactivated:" + dateDeactivate); 17 IDictionary<string, object> state = PhoneApplicationService.Current.State; 18 state["DateDeactivate"] = dateDeactivate; 19 20 } 21 22
Si ejecutamos la aplicación y para debugear pulsamos un botón de un Launcher como el de SearchTask y damos al botón de retroceso para que vuelva a la aplicación y se produzca el efecto Tombstoning
Los mensajes que se muestran de la traza del código vemos que es
Debug Application_Activated:10:05:53 PM
El valor de DateDeactivate:10:05:47 PM
Vemos que a la hora de activar la aplicación recuperamos el valor que hemos guardado al desactivar la aplicación.
Guardaremos en PhoneApplicationService aquellos datos que no estén asociados a una pagina, en cambio si queremos guardar datos asociados a una pagina como la posición de un scroll, los contenidos de un TextBox… Debemos de utilizar los eventos OnNavigatedTo y OnNavigatedFrom.
Una concepto importante que tenemos que tener en cuenta es que en PhoneApplicationService son datos transitorios para el efecto de Tombstoning si queremos datos permanentes para cuando se vuelva a encender la aplicación en el caso de que el usuario la cierre (evento Close) utilizaremos lo visto en el anterior post IsolatedStorage.
Si queréis debugear el efecto Tombstoning sin lanzar ningun Launcher o Chooser debéis de pulsar el botón de windows en el emulador y rápidamente el de retroceso, en este caso se lanzaran los eventos Deactivate y Activated
Espero que os haya ayudado a entender este concepto, importante para dar un experiencia correcta al usuario y para que os aprueben vuestra aplicación en el marketplace