Optimización del ciclo de vida de la aplicación (HTML)

Applies to Windows and Windows Phone

Cuando desarrolles una aplicación, ten en cuenta estos tres eventos importantes en el ciclo de vida de la aplicación: la activación, la suspensión y la reanudación. Aprende acerca de estos eventos y consideraciones importantes de rendimiento para que los tengas en cuenta cuando debas controlarlos.

Activa la aplicación rápidamente

La activación de una aplicación ocurre la primera vez que esta se inicia y se inicializa. El código que ejecuta tu aplicación durante la activación afecta considerablemente la rapidez con la que se inicia la aplicación, por eso, ten cuidado respecto de qué código ejecutar. Veamos algunas maneras de mejorar el rendimiento de la activación de la aplicación.

Usa el evento de inicialización correcto

Cuando tu aplicación carga un archivo HTML (como se describe en la sección sobre la carga de la aplicación), se desencadenan dos eventos importantes para permitir que la aplicación comience con la inicialización: DOMContentLoaded y onLoad. Para que la aplicación finalice la inicialización lo más rápido posible, debes saber cuándo usar estos eventos.

  • Evento DOMContentLoaded

    El evento DOMContentLoaded se genera una vez que la aplicación carga todos sus archivos JavaScript y CSS. Se puede acceder a todos los archivos a los que se hace referencia (incluidas las imágenes, aunque no se garantiza que estas se hayan cargado). En este momento, puedes empezar a inicializar la aplicación (por lo general, no es necesario que se hayan cargado las imágenes para inicializar la aplicación).

    Sugerencia  Usa el evento DOMContentLoaded para comenzar la inicialización general de la aplicación.

  • Evento activated

    El evento activated se genera cuando se activa la aplicación. Indica a la aplicación si se activó porque el usuario la inició o por algún otro medio. Usa el controlador del evento activated para comprobar el tipo de activación y responder a ella correctamente, y para cargar el estado que se necesite para la activación.

  • Evento onload

    Una vez que se generó el evento DOMContentLoaded y se cargaron todas las imágenes a las que hace referencia la página, se genera el evento onload. Si necesitas procesar las imágenes, este es el momento para hacerlo.

Usa el evento DOMContentLoaded para realizar la inicialización global del controlador de eventos activated

Una vez que se inicializó la aplicación, es posible que la plataforma la suspenda y la reanude varias veces antes de que salgas de la aplicación. No uses el controlador de eventos activated para realizar trabajo de inicialización global, porque es posible que se llame al controlador de eventos activated varias veces durante todo el ciclo de vida de la aplicación. Usa el evento DOMContentLoaded para realizar la inicialización global.

El controlador de eventos activated realiza estas dos tareas principales:

  1. Determina el tipo de activación verificando los argumentos del evento activated y respondiendo según corresponda. Realiza solamente el trabajo necesario para controlar ese tipo de activación.
  2. Restaura el estado de la aplicación. En caso de que el tipo de activación sea ActivationKind.launch, restaura el estado anterior de la aplicación si sales de ella activando el objeto WinJS.Application.sessionState. Si contiene datos, úsalos para restaurar el estado de la aplicación. Después llama al método WinJS.UI.processAll para inicializar los controles de la biblioteca de Windows para JavaScript.

En este ejemplo, se muestra cómo controlar los eventos activated y DOMContentLoaded:


(function () {
    "use strict";

    var app = WinJS.Application;

    function initialize() {
        // Set up global event handlers
        // Initialize custom loading UI if necessary
    }

    function activatedHandler(e) {

        if (e.detail.kind == Windows.ApplicationModel.Activation.ActivationKind.launch) {

            // Check whether session state variables are valid.
            // If so, retrieve the application data saved in the checkpoint handler

            if (app.sessionState) {
                // restore previous state from sessionState
            }

            // Check tile arguments and do any specific activation work 
            // related to those arguments. 

            // Then initialize all WinJS controls
            WinJS.UI.processAll();
        }

        if (e.detail.kind === 
              Windows.ApplicationModel.Activation.ActivationKind.filePicker) {
            // Process the file picker request.
        }       
    }

    document.addEventListener("DOMContentLoaded", initialize, false);
    app.addEventListener("activated", activatedHandler, false);
    app.start();
})();


Usa una pantalla de presentación extendida para los inicios prolongados

La aplicación debe estar lista para que el usuario interaccione con ella en el momento en el que desaparece la pantalla de presentación. Si se necesita más tiempo para cargar la aplicación o si quieres mostrar información en tiempo real sobre la carga para los usuarios, puedes crear una pantalla de presentación extendida secundaria generando una vista que imite la pantalla de presentación que muestra Windows. Para obtener instrucciones sobre cómo hacerlo, consulta Cómo mostrar una pantalla de presentación durante más tiempo.

Realiza solamente el trabajo esencial durante la activación

No realices más trabajo del necesario durante la activación. Durante la activación, algunas aplicaciones ejecutan código que no será necesario hasta más adelante. Quitar código innecesario del controlador activado a veces puede reducir varios segundos en el tiempo de inicio de la aplicación.

Un ejemplo común de ejecución de código innecesario es la carga de más información de estado que la que se necesita para activar la aplicación. En lugar de cargar la información de estado completa necesaria para toda la aplicación, carga solamente el subconjunto necesario para que se muestre la página inicial de la aplicación.

Suspende la aplicación rápidamente y ahorra memoria

Otro evento importante en el ciclo de vida de la aplicación es la suspensión. Una aplicación puede suspenderse cuando el usuario la mueve al segundo plano o cuando el sistema entra en estado inactivo. Cuando se suspende la aplicación, se genera el evento suspending, y deben guardarse los datos en cinco segundos como máximo. Si el controlador de eventos suspending de la aplicación no finaliza en cinco segundos, el sistema supone que la aplicación dejó de responder y la finaliza.

El sistema intenta mantener todas las aplicaciones suspendidas posibles en la memoria para que los usuarios puedan alternar entre ellas de modo rápido y fiable. Pero si no hay recursos suficientes para mantener una aplicación en la memoria, la aplicación finaliza. Las aplicaciones no reciben una notificación de que finalizarán, por eso, tu única oportunidad de guardar los datos de la aplicación es durante la suspensión.

Guarda solamente los objetos que se modificaron

Muchas aplicaciones vuelven a serializar todos los datos que se usaron en ella, incluso si estos no se modificaron. Esto hace que la aplicación tarde más en serializar y guardar los datos, además del tiempo adicional que se necesita para leer y deserializar los datos cuando se reanuda la aplicación.

En lugar de ello, te recomendamos que la aplicación determine cuándo cambió realmente su estado, y que serialice y deserialice solamente los datos que se modificaron.

Libera objetos costosos durante la suspensión y recréalos durante la reanudación

Como el sistema intenta mantener todas las aplicaciones suspendidas posibles en la memoria, es importante que reduzcas al mínimo la cantidad de memoria que usa la aplicación. Cuando una aplicación se suspende y permanece en la memoria del sistema, se la puede pasar al primer plano rápidamente para que el usuario interaccione con ella, sin que sea necesario mostrar una pantalla de presentación ni realizar una operación de carga prolongada.

Determinados objetos, como archivos y dispositivos, ocupan una gran cantidad de memoria. Durante la suspensión, las aplicaciones deben liberar controles para estos objetos y recrear el control cuando sea necesario. Este cambio puede reducir la cantidad de memoria que usa la aplicación de cualquier parte, de cientos de kilobytes a pocos megabytes, y disminuye la probabilidad de que el sistema finalice la aplicación.

Guardar el estado no solo en el evento de suspensión

Te recomendamos que la aplicación guarde el estado de forma gradual no solo en el evento suspending. Es decir que cuando un bit de estado cambia, en lugar de guardarlo al suspenderse, la aplicación puede guardarlo de inmediato y no esperar al evento suspending. Esto minimiza la cantidad de trabajo necesario dentro del controlador suspending.

Reanuda la aplicación rápidamente

Una aplicación suspendida puede reanudarse cuando el usuario la mueve al primer plano o cuando el sistema sale del estado inactivo. Cuando se reanuda una aplicación en estado suspendido, continúa en el punto en el que estaba en el momento de la suspensión. No se pierden datos de la aplicación, porque se guardaron en la memoria. Pero la aplicación pudo haber estado suspendida durante un período prolongado, tal vez varias horas.

Cuando se reanuda la aplicación, las variables y los objetos tienen exactamente el mismo estado que tenían cuando esta se suspendió. Te recomendamos que registres un controlador de eventos resuming si necesitas actualizar datos u objetos que pudieran haberse modificado entre el momento en que se suspendió la aplicación y el instante en que se reanudó. Puedes usar un controlador de eventos resuming con estos propósitos:

  • Comprobar si necesitas actualizar los datos de una fuente en línea que pudiera haberse modificado mientras la aplicación se encontraba suspendida.
  • Si estabas sin conexión cuando se suspendió la aplicación, comprueba si hay conectividad al reanudar y cambia al modo en línea. También ocurre lo contrario, en especial si el usuario se subió a un avión mientras la aplicación estaba suspendida.
  • Actualiza todas las entradas con sensor cuyo seguimiento estés realizando, como la brújula, la orientación o la Geolocalización.
  • Actualiza el diseño de la aplicación, ya que esta puede reanudarse directamente en un estado de visualización distinto del que tenía cuando se suspendió, incluso en otra resolución y escalado si el dispositivo se ha conectado a un monitor externo, una base de acoplamiento, etc., o desconectado de estos. Puede que el usuario también haya ido a Configuración de PC > Centro de accesibilidad y presionado Aumentar el tamaño de los objetos en la pantalla. También verás eventos relacionados con foco, visibilidad y tamaño en los lugares en que puedes realizar estas tareas, pero no está demás comprobarlo.
  • Habilita o deshabilita los comandos de la barra de la aplicación y otros controles en el Canvas que dependen de contenido del Portapapeles.
  • Llama a Windows.System.Display.displayRequest.requestActive al reanudar si es necesario. Por ejemplo, si solicitas mantener la pantalla activada a través de requestActive, deberás llamar a requestRelease al suspender y volver a llamar a requestActive al reanudar.
  • Comprueba el estado de licencia de las aplicaciones de evaluación y de las compras desde la aplicación si usas fechas de expiración. Mientras la aplicación esté suspendida, no recibirás el evento licencechanged, pero puede que se desencadene al reanudar. En cualquier caso, es buena idea comprobar las licencias al reanudar.
  • Si usas tareas en segundo plano de cualquier tipo para actualizar los datos de la aplicación, usa resuming para actualizar la aplicación con ese nuevo estado.
  • Comprueba si aparecieron datos de roaming nuevos mientras la aplicación estaba suspendida. Puede que Windows ponga el evento Windows.Storage.ApplicationData.dataChanged en cola si esto sucede, por lo que quizás puedas controlarlo también de esa forma.
  • Si emites notificaciones o actualizaciones de icono mientras la aplicación se está ejecutando (y no usas notificaciones periódicas o de inserción), piensa si debes actualizarlas al reanudar, incluidas las notificaciones programadas.
  • Si realizas transferencias de datos que pueden verse afectadas por los costos de las redes de uso medido, usa resuming para comprobar el tipo de red y para responder como corresponde. Ten en cuenta que las transferencias que estableces con la Background Transfer API funcionarán con esta cuando la aplicación esté suspendida.

 

 

Mostrar:
© 2014 Microsoft