Ejecutando una aplicación en segundo plano (Tombstoning)

Ejecutando una aplicación en segundo plano (Tombstoning)

Este artículo es una traducción del artículo original encontrado en: http://create.msdn.com/en-US/education/quickstarts/Running_your_App_in_the_Background_%28Tombstoning%29.

 

El sistema operativo Windows Phone permite que se ejecute sólo una aplicación a la vez. Cuando el usuario se desplaza fuera de la aplicación, el sistema operativo la  finaliza. Para proporcionar una buena experiencia para el usuario, el sistema operativo proporciona apoyo para ayudar a restaurar la aplicación a un estado presentable cuando sea reactivada. Este artículo te describe el proceso Tombstoning, el ciclo de vida de las aplicaciones, y cómo restaurar el estado.  

Este artículo contiene las siguientes secciones:

  • Información general de Tombstoning
  • Ciclo de vida de la Aplicación
  • Estado de la Aplicación
  • Estado de la Página
  • Mejores prácticas

Información general de Tombstoning

El sistema operativo Windows Phone no permite ejecutar en segundo plano las aplicaciones de terceros, por lo tanto, sólo una aplicación puede ejecutarse en su momento. Las razones para no permitir que ninguna de las aplicaciones de terceros funcione en segundo plano, son para asegurar una experiencia de usuario consistente y responsiva. Cuando el usuario se desplaza fuera de la aplicación, el sistema operativo Windows Phone desactiva la aplicación. Esto es a lo que se llama tombstoning. Es el proceso en el que el sistema operativo desactiva el proceso de una aplicación cuando el usuario se desplaza fuera de la aplicación. Una aplicación puede ser desactivada en los siguientes casos: 

·         Es recibida una llamada telefónica. La reactivación se produce cuando la llamada termina. 

·         El teléfono va a dormir. La reactivación se produce cuando el usuario despierta el teléfono.

·         El usuario presiona el botón de inicio o de búsqueda, o responde a una notificación. La reactivación se produce cuando el usuario vuelve a la aplicación pulsando en el botón Atrás una o varias veces.

·         La aplicación llama a una tarea externa. La reactivación se produce cuando el usuario lleva a cabo la tarea.

Cuando la aplicación tombstoned se activa nuevamente, debe obtener el mismo aspecto que tenía anteriormente, a fin de mantener una buena experiencia de usuario. Lo ideal sería que el usuario no debe saber que es un proceso completamente nuevo, cuando se reactiva una aplicación tombstoned. Por ejemplo, supongamos que abres una aplicación con una Página larga, te desplazas hacia abajo un poco para leerla, y después navegas hacia otra Página.  Cuando retrocedes a la Página original, no es muy incómodo perder el lugar en donde estabas si te regresas al inicio de la Página.  Por el otro lado, si has gastado minutos llenando un formulario largo, definitivamente no querrás ver todo tu trabajo perderse después de que otra Página te diga que has cometido un pequeño error.

Para lograr esto, cuando la aplicación se desactiva, el sistema operativo mantiene la información de estado acerca de la aplicación en la memoria, y utiliza esa información para restaurar la aplicación a un estado presentable justo al momento de reactivarse.

Windows Phone proporciona métodos y eventos para almacenar y restaurar los estados de Aplicación y de la Página. Estos métodos y eventos se describen más adelante en este artículo.

Ciclo de Vida de la Aplicación

Las aplicaciones del teléfono pueden ser desactivadas, poseen un ciclo de vida único que necesitas entender. El sistema operativo proporciona cuatro eventos que indican el estado de tu aplicación en el ciclo de vida. Puedes utilizar estos eventos para tomar las acciones necesarias en tu aplicación. Estos eventos son Launching (Iniciando), Closing (Cerrando), Deactivated (Desactivado) y Activated (Activado).

En la siguiente ilustración se muestra cuándo se producen estos eventos.

clip_image002

Launching

Cuando una aplicación se inicia desde la pantalla de inicio, se dice que será “Iniciada”. Cada vez que el usuario inicia una aplicación, se crea una nueva instancia de la aplicación. Cuando se inicia la aplicación, se produce el evento Launching. El siguiente caso muestra el código del evento Launching de que está presente en el archivo App.xaml.cs.  

/ / Código que se ejecuta cuando la aplicación es Launching (por ejemplo, / / / /desde Inicio)

/ / Este código no se ejecutará cuando la aplicación se vuelva a activar

 

private void Application_Launching (object sender, LaunchingEventArgs e)

{

}

 

Puedes utilizar el evento Launching para guardar de forma incremental la configuración y otros datos persistentes para así reducir la cantidad de datos que necesitas cuando cambia el estado de la aplicación. Esto es opcional, y para aplicaciones con una pequeña cantidad de datos persistentes, puede ser innecesaria.

Closing

Al pulsar el botón Atrás en el teléfono, el modelo de navegación permite al usuario navegar hacia atrás a través de las páginas de la aplicación, e incluso entre las aplicaciones. Sin embargo, una vez que el usuario accede a la primera Página de la aplicación, pulsando el botón Atrás se ejecuta el evento Closing y se termina la aplicación. Puedes utilizar este evento para guardar datos persistentes en el almacenamiento aislado. El siguiente código muestra el evento Closing que presente en el archivo App.xaml.cs.   

/ / Código que se ejecuta cuando la aplicación se cierra.

/ / Este código no se ejecutará cuando la aplicación es desactivada

private void Application_Closing(object sender, ClosingEventArgs e)

{

}

Deactivated

Una aplicación puede ser desactivada (no cerrada) ya sea como resultado de que otra aplicación tome el control del frente del teléfono, como por ejemplo una llamada telefónica entrante, o como resultado de que el usuario pulse el botón Inicio. En estos casos, el evento Deactivated se produce. El siguiente código  muestra el  evento Deactivated presente en el archivo App.xaml.cs.

/ / Código que se ejecuta cuando la aplicación se desactiva (enviada al fondo)

/ / Este código no se ejecutará cuando la aplicación se está cerrando

private void Application_Deactivated (object sender, DeactivatedEventArgs e)

{

}

A diferencia de una aplicación que se cierra, una aplicación desactivada puede llegar a ser tombstoned. Esto significa que ya no se ejecutará, pero el sistema operativo mantendrá un registro de la aplicación y almacenará un conjunto de datos del estado de la aplicación. Es posible que el usuario vuelva a la aplicación tombstoned, y si este es el caso, se reactivará.  Por lo tanto debes almacenar la información acerca del estado actual de la aplicación utilizando el diccionario que se expone a través de la propiedad PhoneApplicationService.State en el manejador de evento Deactivated. Los datos almacenados en este diccionario, son datos de estado transitorio, es decir, datos que ayudarán a la aplicación a restablecer su estado antes de que pasara a desactivado.  Ya que no hay ninguna garantía de que una aplicación tombstoned sea reactivada, también se deben guardar los datos persistentes de la aplicación en el almacenamiento aislado durante este evento. Todas las acciones efectuadas en el manejador del evento Deactivated deben ser completadas dentro de 10 segundos, o el sistema operativo terminará por sí mismo la aplicación. Así que si tu aplicación tiene grandes cantidades de datos existentes, es posible que desees guardarlos de forma incremental al momento que la aplicación se esté ejecutando.

También es posible que una aplicación se desactive sin ser tombstoned. Esto sucede por ejemplo, si el usuario presiona el botón Inicio y luego en el botón Atrás en rápida sucesión. Por esta razón, es importante no hacer nada destructivo en el manejador del evento Deactivated. Tu aplicación debe ser capaz de continuar después de completar el manejador Deactivated sin que exista la necesidad de llamar al manejador del evento Activated.

Activated

Después de que una aplicación ha sido desactivada y tombstoned, el usuario puede volver a la aplicación presionando el botón Atrás hasta que la aplicación sea alcanzada. Cuando el usuario vuelve a la aplicación tombstoned, esta será reacticada y el evento Activated es ejecutado. Puedes utilizar este evento para leer los valores de PhoneApplicationService.State para recuperar el estado de la aplicación que el usuario había experimentado antes que la aplicación fuese desactivada.  El siguiente código muestra el evento Activated que presente en el archivo App.xaml.cs.

/ / Código que se ejecuta cuando la aplicación es activada (traída al frente)

/ / Este código no se ejecutará cuando la aplicación se inicie por primera vez

private void Application_Activated (object sender, ActivatedEventArgs e)

{

}

 

Estado de la Aplicación

El Estado de la Aplicación es el estado de la aplicación que no es específica a una Página en particular. Si tu aplicación utiliza datos globales tales como información de acceso o configuración de la aplicación como temas, lo más probable es que sean utilizados por varias páginas dentro de la aplicación. Estos datos se consideran parte del estado de la aplicación. Cuando la aplicación se reactiva después de ser tombstoned, los datos se pierden a menos que específicamente los guardes.  En general utilizas los eventos  Launching, Closing, Deactivated, y Activated  para inicializar y mantener el estado de aplicación. Cuando tu aplicación es desactivada el sistema operativo guarda el contenido del diccionario expuesto a través de la propiedad PhoneApplicationService.State. Puedes almacenar el estado a nivel de aplicación en la propiedad PhoneApplicationService.State en el evento Deactivated, y recuperar los datos de la propiedad en PhoneApplicationService.State en el evento Activated. Para obtener más información, visualiza Cómo conservar y restaurar el estado de aplicaciones para Windows Phone.

Si tu aplicación tiene datos persistentes, puedes almacenar los datos en el almacenamiento aislado en lugar de utilizar el diccionario de estados. El almacenamiento aislado es un área de almacenamiento de archivos localizado en el disco del teléfono. Es análogo al sistema de archivos de escritorio. Los datos almacenados en el almacenamiento aislado pueden tardar varios segundos en cargar, por lo que se debe utilizar sólo para datos con almacenamiento indefinido y para objetos no serializables. Además, debes considerar cuidadosamente dónde colocas tu código de almacenamiento aislado con el fin de minimizar el impacto de algún retraso.  Por ejemplo, si tienes bastantes datos de la aplicación para almacenar, debes evitar guardar todo de una vez al salir de la aplicación, y en vez de eso irlo guardando de manera incremental. En general, debes guardar los datos en el almacenamiento aislado tan pronto como estén disponibles, o tan pronto como sea posible. Para obtener más información, consulta Almacenamiento Aislado.

Estado de la Página

El Estado de la Página es el estado visual de una Página en la aplicación. Cuando el usuario presiona el botón Atrás para volver a la aplicación desactivada, el sistema operativo Windows Phone mostrará automáticamente la última Página de la aplicación que el usuario estaba visualizando. Sin embargo, tú eres responsable de asegurarte que el estado de la Página sea guardado y restaurado para que el usuario vea lo mismo cuando el usuario navegó fuera de ella. El estado de la Página incluye cosas tales como el contenido de un cuadro de texto y la posición de un ScrollViewer.  Esta sección te mostrará cómo se puede guardar y restaurar el estado de la Página con el fin de proporcionar una experiencia transparente para el usuario.

Para guardar y restaurar el estado de la interfaz de usuario de una Página, debes utilizar el constructor de la Página, el método OnNavigatedTo, y el método OnNavigatedFrom. El constructor de la Página se llama en la primera navegación.  OnNavigatedTo es llamado en cada navegación a una Página cuando la aplicación y la página han finalizado en cargar y están disponibles para usarse.  OnNavigatedFrom es llamado en cada navegación hacia fuera de la página cuando la aplicación y la Página no han comenzado a descargarse. Puedes inicializar información a nivel de Página en el constructor, puedes restaurar el estado de la Página en el método OnNavigatedTo, y guardar el estado de una Página en el método OnNavigatedFrom. 

clip_image004

Para guardar y restaurar el estado de la Página, típicamente realizarás los siguientes pasos.

·         Agrega una variable booleana a la Página (con nombre newPageInstance en el ejemplo de código más adelante en este artículo) y asigna su valor a false.  Esta variable se utiliza para determinar si el estado de la interfaz de usuario debe ser restaurado.

·         En el constructor de la Página, establece la variable de nivel de la Página en true. El constructor se llama cuando la Página se crea por primera vez en una instancia de la aplicación o si la Página se vuelve a crear después que la aplicación fue desactivada. El constructor no se llama si el usuario simplemente navega de nuevo desde otra Página en esta aplicación, porque la Página ya está en la memoria.

·         Reemplaza e implementa el método OnNavigatedTo. En este método recupera el estado a nivel de Página con la propiedad PhoneApplicationPage.State.

·         Reemplaza e implementa el método OnNavigatedFrom.  En este método guarda el estado a nivel de Página en la propiedad PhoneApplicationPage.State.

El siguiente ejemplo tiene dos páginas llamadas Página de inicio y segunda Página. Cuando haces clic en el botón Go to the Second Page de la Página de inicio, la aplicación navega a la segunda Página.  La segunda Página tiene un formulario con TextBox, dos RadioButton, y un CheckBox. Si introduces algunos datos en estos campos en la segunda Página y luego pulsas el botón Start para salir de la aplicación, ésta entra en  estado desactivado. Si te desplazas de nuevo a la segunda Página con el botón Atrás del teléfono puedes ver que los datos que has introducido antes de salir de la aplicación son restaurados.

clip_image006

En la siguiente ilustración se muestra el comportamiento al no incluirse el código para restaurar el estado de la Página. 

clip_image008

Agrega el siguiente código en la segunda Página para guardar y restaurar su estado.

C#

 

public partial class SecondPage : PhoneApplicationPage

{

bool newPageInstance = false;

public SecondPage()

{

InitializeComponent();

newPageInstance = true;

}

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

{

if (State.ContainsKey("textbox") && newPageInstance == true)

{

MyTB.Text = (string)State["textbox"];

MyRB1.IsChecked = (bool?)State["radiobutton1"];

MyRB2.IsChecked = (bool?)State["radiobutton2"];

MyCB.IsChecked = (bool?)State["checkbox"];

}

base.OnNavigatedTo(e);

}

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)

{

newPageInstance = false;

State["textbox"] = MyTB.Text;

State["radiobutton1"] = MyRB1.IsChecked;

State["radiobutton2"] = MyRB2.IsChecked;

State["checkbox"] = MyCB.IsChecked;

base.OnNavigatedFrom(e);

}

Para mayor información acerca del estado de las Páginas, revisa Cómo preservar y restaurar el estado de una página en Windows Phone.

Mejores Prácticas

Los siguientes son algunas mejores prácticas para el modelo de ejecuciónque puedes seguir al momento de desarrollar una aplicación para Windows Phone:  

·         Cuando la aplicación se ejecuta, ya sea por el mosaico o por la lista de aplicaciones instaladas, el usuario debe obtener una experiencia consistente en la raíz.  Debe quedar claro para ellos que están experimentando una nueva instancia de la aplicación.

·         Cuando la aplicación es activada desde un estado tombstoned, el usuario debe obtener una experiencia consistente con aquella que se mostraba cuando la aplicación fue desactivada.  No debe ser evidente para el usuario que la aplicación fue terminada y reiniciada.

·         Después que una aplicación ha sido desactivada (tombstoned), el usuario puede que no vuelva a la aplicación de inmediato.  Por esta razón, debes guardar el estado persistente en el almacenamiento aislado tanto en el manejador del evento Deactivated como en el manejador del evento Closing. Para evitar la duplicidad de código es posible que desees crear un método único que guarde los datos persistentes en el almacenamiento aislado y luego llamar al mismo método desde ambos manejadores de evento.

·         Las aplicaciones deberán completar todas las acciones del manejador de evento Deactivated en menos de 10 segundos.  Una aplicación que lleva más de 10 segundos para completar su manejador Deactivated será terminada a la fuerza y ya no será accesibles a través del botón Atrás del teléfono.  Si tu aplicación tiene más datos de estado que pueda guardar en unos segundos, tal vez quieras guardarlos de forma incremental en el almacenamiento aislado mientras la aplicación está ejecutando.

Para obtener más información, vea Mejores Prácticas para el Modelo de ejecución en Windows Phone.

3 thoughts on “Ejecutando una aplicación en segundo plano (Tombstoning)

  1. delDiplomado

    Las paginas se restauran sin tener que implementar los eventos OnNavigatedTo y OnNavigatedFrom, el tutorial es viejo o algo por el estilo?

  2. Victor Ramos

    Sip creo que esta desactualizado, ademas del icno de IE que se mira en azul (con wp 7.0/7.1 aparece en rojo) en el siguiente leccion ya comentan sobre el estado “Dormant” (eso que hace que sea restaurado solo el etado de la pagina).

  3. Mauro

    Hola, Gracias por el articulo. Una consulta, yo al querer activar una función en una aplicación y no abrirla mas luego, en que estado tendría que colocar el código para que quede guardada esa configuración ?

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">