Share via


El modelo de ejecución de las Apps de WinRT : Suspended | C#

Intermedio

Las aplicaciones que se ejecutan en la interfaz de WinRT, cuentan con un estado de proceso 'extra' que no había existido jamás en Windows, el estado suspend.

Windows es un sistema orientado a múltiples dispositivos, dentro de ellos los dispositivos móviles dónde el consumo de energía trasciende a un nivel muy importante.

Por ello es vital para el sistema reducir el consumo innecesario de recursos como lo son la memoria y el procesador, y esto no se logra de otra manera que reduciendo su consumo al mínimo necesario o prescindiendo totalmente de su uso.

El ciclo tradicional de ejecución de un proceso es una sucesión de estos estados:

  • Sin iniciar ( existe el programa pero no el proceso)
  • Iniciado ( el programa se convierte en un proceso, entra en ejecución)
  • Finalizado ( apenas dura un tiempo así y luego es removido de la lista de procesos)

Ahora para las Apps WinRT existe un nuevo estado intermedio que si bien mantiene nuestra aplicación en memoría, no le asigna tiempo de procesador: Suspended .

Cuando una App esta abierta y luego cambiamos el foco a otra

App al escritorio la App se pone en estado Suspend. Sin embargo hay formas de soportar que nuestra App ejecute actividades en segundo plano.

Una vez la aplicación esta en estado suspend pueden pasar tres cosas

  • El usuario regresa a la aplicación y esta continua con su estado ‘en ejecución”
  • La aplicación se mantiene suspend por más de 15 minutos es abortada por el sistema
  • Si el sistema requiere recursos de memoria o procesador para otra aplicación y no hay suficientes, abortara la aplicación

El punto 1 no tiene problema, de hecho: cool

Apps Suspended

y aunque más adelante veremos la manera correcta de llevar el tema, por el momento los puntos dos y tres de seguro ya te hicieron pensar en :

Porqueeeeeeeeeee

Why?

Pero como ya te dije, no hay lio.

La idea de conservar la batería matando las aplicaciones no es descabellada, desde que el usuario no se entere. Como se logra esto?

Imagina que justo antes de que tu aplicación sea eliminada puedes guardar el trabajo pendiente del usuario, en que modulo de tu aplicación donde estaba el usuario y demás datos. De tal forma que cuando el usuario regrese a tu aplicación aunque esta abra desde el principio puedas dejar al usuario justo donde estaba antes de que el sistema la hubiese terminado.

Seria cool no? entonces porque no hacerlo?

Windows 8 incorpora API’s para hacerlo

Sorpresa!

El evento Suspending

Cada vez que una aplicación entra en suspensión se dispara el evento Suspending, asi que puedes hacer uso de este evento para guardar lo que necesites este evento se encuentra a nivel de aplicación por lo cual debes manipularlo directamente desde App.xaml.cs. Como guardarlo? eso ya depende de ti, pudes hacer uso de ApplicationData.Current para crear o cargar settings, o para crear o leer archivos.

Incluso puedes optar por crear un objeto y simplemente serializarlo a un archivo cada que lo consideres conveniente o realizar el proceso inverso.

Para guardar estos settings no dispones sino de 2 segundos como tiempo de espera máximo, si tu aplicación tarda más de dos segundos en guardar, el sistema la terminara automáticamente, dejando la operación de guardado probablemente inconsistente.

 
private async void OnSuspending(object sender, SuspendingEventArgs e)
{
    SuspendingDeferral deferral = e.SuspendingOperation.GetDeferral();
    //Guardar datos
    deferral.Complete();
}

Lo único ‘raro’ allí es la creación del objeto deferral. Este objeto se usa para que una vez se han guardado todos los campos se le notifique al sistema operativo para que este pueda disponer de la aplicación con tranquilidad, en todo caso aunque no lo uses no tienes más de dos segundos para realizar la operación.

Como restaurar la aplicación usando los datos guardados previamente?

Cuando un usuario arranca una aplicación se dispara en appx.xaml.cs el método OnLaunched, el cual puedes sobreescribir. Allí puedes preguntar acerca de como cerro la aplicación la última vez, de tal forma que si cerro gracias a intervención del sistema puedes tomar la decisión de leer la información previamente guardada en disco.

 
protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
    if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
    {
        //RecuperarDatos
    }
}

Si la terminación fue voluntaria por el usuario, puedes decidir iniciar la aplicación normalmente, pero todo depende de las necesidades puntuales de cada caso.

Es muy recomendable que crees tu aplicaciópn dando soporte a la suspención y subsecuente terminación por parte del sistema para tener une experiencia de usuario consistente en todo momento.

Cool