Administrar el inicio previo de aplicaciones

Obtenga información sobre cómo controlar el inicio previo de la aplicación reemplazando el método OnLaunched y llamando a CoreApplication.EnablePrelaunch.

Introducción

Cuando los recursos del sistema disponibles permiten, el rendimiento de inicio de las aplicaciones para UWP en dispositivos de familia de dispositivos de escritorio se mejora iniciando proactivamente las aplicaciones usadas con más frecuencia del usuario en segundo plano. Una aplicación iniciada previamente se pone en estado suspendido poco después de iniciarse. A continuación, cuando el usuario invoca la aplicación, la aplicación se reanuda llevándola del estado suspendido al estado en ejecución, lo que es más rápido que iniciar la aplicación en frío. La experiencia del usuario es que la aplicación se inicia muy rápidamente.

Antes de Windows 10, las aplicaciones no aprovechaba automáticamente el inicio previo. En Windows 10, versión 1511, todas las aplicaciones de la Plataforma universal de Windows (UWP) son candidatas para el inicio previo. En Windows 10, versión 1607, debes optar por iniciar previamente el comportamiento llamando a CoreApplication.EnablePrelaunch y pasando true. Un buen lugar para poner esta llamada está dentro de OnLaunched, cerca de la ubicación donde se realiza la if (e.PrelaunchActivated == false) comprobación.

Si una aplicación se inicia previamente depende de los recursos del sistema. Si el sistema está experimentando presión de recursos, las aplicaciones no se inician previamente.

Es posible que algunos tipos de aplicaciones deban cambiar su comportamiento de inicio para funcionar bien con el inicio previo. Por ejemplo, una aplicación que reproduce música cuando se inicia; un juego que supone que el usuario está presente y muestra objetos visuales elaborados cuando se inicia la aplicación; una aplicación de mensajería que cambia la visibilidad en línea del usuario durante el inicio; todas ellas pueden identificar cuándo se ha iniciado previamente la aplicación y pueden cambiar su comportamiento de inicio, tal como se describe en las secciones siguientes.

Las plantillas predeterminadas para proyectos XAML (C#, VB, C++) admiten el inicio previo.

Inicio previo y ciclo de vida de la aplicación

Una vez iniciada previamente una aplicación, entra en el estado suspendido. (Consulta Controlar la suspensión de la aplicación).

Detectar y controlar el inicio previo

Las aplicaciones reciben la marca LaunchActivatedEventArgs.PrelaunchActivated durante la activación. Use esta marca para ejecutar código que solo se debe ejecutar cuando el usuario inicie explícitamente la aplicación, como se muestra en la siguiente modificación de Application.OnLaunched.

protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    // CoreApplication.EnablePrelaunch was introduced in Windows 10 version 1607
    bool canEnablePrelaunch = Windows.Foundation.Metadata.ApiInformation.IsMethodPresent("Windows.ApplicationModel.Core.CoreApplication", "EnablePrelaunch");

    // NOTE: Only enable this code if you are targeting a version of Windows 10 prior to version 1607,
    // and you want to opt out of prelaunch.
    // In Windows 10 version 1511, all UWP apps were candidates for prelaunch.
    // Starting in Windows 10 version 1607, the app must opt in to be prelaunched.
    //if ( !canEnablePrelaunch && e.PrelaunchActivated == true)
    //{
    //    return;
    //}

    Frame rootFrame = Window.Current.Content as Frame;

    // Do not repeat app initialization when the Window already has content,
    // just ensure that the window is active
    if (rootFrame == null)
    {
        // Create a Frame to act as the navigation context and navigate to the first page
        rootFrame = new Frame();

        rootFrame.NavigationFailed += OnNavigationFailed;

        if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
        {
            //TODO: Load state from previously suspended application
        }

        // Place the frame in the current Window
        Window.Current.Content = rootFrame;
    }

    if (e.PrelaunchActivated == false)
    {
        // On Windows 10 version 1607 or later, this code signals that this app wants to participate in prelaunch
        if (canEnablePrelaunch)
        {
            TryEnablePrelaunch();
        }

        // TODO: This is not a prelaunch activation. Perform operations which
        // assume that the user explicitly launched the app such as updating
        // the online presence of the user on a social network, updating a
        // what's new feed, etc.

        if (rootFrame.Content == null)
        {
            // When the navigation stack isn't restored navigate to the first page,
            // configuring the new page by passing required information as a navigation
            // parameter
            rootFrame.Navigate(typeof(MainPage), e.Arguments);
        }
        // Ensure the current window is active
        Window.Current.Activate();
    }
}

/// <summary>
/// This method should be called only when the caller
/// determines that we're running on a system that
/// supports CoreApplication.EnablePrelaunch.
/// </summary>
private void TryEnablePrelaunch()
{
    Windows.ApplicationModel.Core.CoreApplication.EnablePrelaunch(true);
}

Importante

El método TryEnablePrelaunch del ejemplo de código anterior llama a CoreApplication.EnablePrelaunch. Y se llama a TryEnablePrelaunch solo cuando la aplicación se ejecuta en una versión de Windows que admite CoreApplication.EnablePrelaunch. En general, si hay alguna duda, debe usar una API de Windows solo después de determinar que es compatible con la plataforma en la que se ejecuta el código. Y puede hacerlo mediante la clase ApiInformation , como se muestra en el ejemplo de código anterior.

También hay código en el ejemplo anterior que puedes quitar la marca de comentario si la aplicación necesita no iniciarse previamente cuando se ejecuta en Windows 10, versión 1511. En la versión 1511, todas las aplicaciones para UWP optaron automáticamente por iniciarse previamente, lo que podría no ser adecuado para la aplicación.

Usar el evento VisibilityChanged

Las aplicaciones que se activan con el inicio previo no son visibles para el usuario. Son visibles cuando el usuario cambia a estas. Quizás quieras retrasar determinadas operaciones hasta que la ventana principal de la aplicación sea visible. Por ejemplo, si la aplicación muestra una lista de elementos de novedades de una fuente, podrías actualizar la lista durante el evento VisibilityChanged, en lugar de usar la lista que se creó durante el inicio previo de la aplicación, ya que podría estar obsoleta en el momento en que el usuario active la aplicación. El siguiente código controla el evento VisibilityChanged de MainPage:

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();

        Window.Current.VisibilityChanged += WindowVisibilityChangedEventHandler;
    }

    void WindowVisibilityChangedEventHandler(System.Object sender, Windows.UI.Core.VisibilityChangedEventArgs e)
    {
        // Perform operations that should take place when the application becomes visible rather than
        // when it is prelaunched, such as building a what's new feed
    }
}

Guía de juegos de DirectX

Los juegos de DirectX, por lo general, no deben habilitar el inicio previo porque muchos juegos de DirectX hacen su inicialización antes de que el inicio previo pueda detectarse. A partir de Windows 1607, edición de aniversario, tu juego no se podrá iniciar previamente de manera predeterminada. Si quieres que el juego aproveche el inicio previo, llama a CoreApplication.EnablePrelaunch(true).

Si el juego está destinado a una versión anterior de Windows 10, puedes controlar la condición de inicio previo para salir de la aplicación:

void ViewProvider::OnActivated(CoreApplicationView const& /* appView */, Windows::ApplicationModel::Activation::IActivatedEventArgs const& args)
{
    if (args.Kind() == Windows::ApplicationModel::Activation::ActivationKind::Launch)
    {
        auto launchArgs{ args.as<Windows::ApplicationModel::Activation::LaunchActivatedEventArgs>()};
        if (launchArgs.PrelaunchActivated())
        {
            // Opt-out of Prelaunch.
            CoreApplication::Exit();
        }
    }
}

void ViewProvider::Initialize(CoreApplicationView const & appView)
{
    appView.Activated({ this, &App::OnActivated });
}
void ViewProvider::OnActivated(CoreApplicationView^ appView,IActivatedEventArgs^ args)
{
    if (args->Kind == ActivationKind::Launch)
    {
        auto launchArgs = static_cast<LaunchActivatedEventArgs^>(args);
        if (launchArgs->PrelaunchActivated)
        {
            // Opt-out of Prelaunch
            CoreApplication::Exit();
            return;
        }
    }
}

Instrucciones generales

  • Las aplicaciones no deben realizar operaciones de ejecución prolongada durante el inicio previo porque la aplicación finalizará si no se puede suspender rápidamente.
  • Las aplicaciones no deben iniciar la reproducción de audio desde Application.OnLaunched si la aplicación ya está iniciada. De lo contrario, la aplicación no será visible y no estará claro por qué se está reproduciendo audio.
  • Durante el inicio, las aplicaciones no deben realizar operaciones que supongan que la aplicación es visible para el usuario o que el usuario la inició explícitamente. Dado que ahora se inicia una aplicación en segundo plano sin ninguna acción explícita del usuario, los desarrolladores deberían tener en cuenta la privacidad, la experiencia del usuario y las implicaciones de rendimiento.
    • Un ejemplo de consideración de privacidad es la necesidad de que una aplicación social cambie el estado del usuario a conectado. Debería esperar hasta que el usuario cambie a la aplicación en lugar de cambiar el estado en el inicio previo de la aplicación.
    • Un ejemplo de consideración de la experiencia del usuario es que si tienes una aplicación, como un juego, que muestra una secuencia de introducción al iniciarse, podrías retrasar la secuencia de introducción hasta que el usuario cambie a la aplicación.
    • Un ejemplo de implicación de rendimiento es que podrías esperar a que el usuario cambie a la aplicación para recuperar la información meteorológica actual, en lugar de cargarla con el inicio previo de la aplicación y tener que volver a cargarla cuando la aplicación sea visible para garantizar que la información esté actualizada.
  • Si la aplicación borra su icono dinámico al iniciarse, aplaza esto hasta el evento de cambio de visibilidad.
  • La telemetría de la aplicación debería distinguir entre las activaciones de icono normales y las de inicio previo para que puedas limitar el escenario en caso de problemas.
  • Si tienes Microsoft Visual Studio 2015 Update 1 y Windows 10, versión 1511, puedes simular el inicio previo de la aplicación en Visual Studio 2015 eligiendo Depurarotros destinos> de depuración >Depurar inicio previo de la aplicación universal de Windows.