Compartir a través de


Administrar el inicio previo de aplicaciones

Aprenda a controlar el inicio previo de la aplicación invalidando 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 por el usuario con más frecuencia en segundo plano. Una aplicación iniciada previamente se coloca en el estado suspendido poco después de iniciarse. A continuación, cuando el usuario invoca la aplicación, la aplicación se reanuda al traerla 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 simplemente se inició muy rápidamente.

Antes de Windows 10, las aplicaciones no aprovecharon automáticamente el inicio previo. En Windows 10, versión 1511, todas las aplicaciones Plataforma universal de Windows (UWP) eran candidatas para iniciarse previamente. En Windows 10, versión 1607, debes optar por iniciar el comportamiento previo llamando a CoreApplication.EnablePrelaunch y pasando true. Un buen lugar para poner esta llamada está dentro de OnLaunched, cerca de la ubicación en la que 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 experimenta presión de recursos, las aplicaciones no se inician previamente.

Es posible que algunos tipos de aplicaciones necesiten cambiar su comportamiento de inicio para que funcione 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 estado suspendido. (consulte Controlar la suspensión de la aplicación).

Detección y control del 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 tryEnablePrelaunch se llama 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 dejar de 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 iniciar previamente, lo que podría no ser adecuado para la aplicación.

Uso del evento VisibilityChanged

Las aplicaciones activadas por el inicio previo no son visibles para el usuario. Se vuelven visibles cuando el usuario cambia a ellos. Es posible que quiera retrasar ciertas operaciones hasta que la ventana principal de la aplicación esté visible. Por ejemplo, si la aplicación muestra una lista de elementos nuevos de una fuente, podría actualizar la lista durante el evento VisibilityChanged en lugar de usar la lista que se creó cuando la aplicación se ha iniciado previamente porque puede quedar obsoleta en el momento en que el usuario activa la aplicación. El código siguiente controla el evento VisibilityChanged para 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

Por lo general, los juegos de DirectX no deberían habilitar el inicio previo porque muchos juegos directX realizan su inicialización antes de que se pueda detectar el inicio previo. A partir de Windows 1607, edición anniversary, tu juego no se iniciará previamente de forma predeterminada. Si quieres que tu juego aproveche el inicio previo, llama a CoreApplication.EnablePrelaunch(true).

Si tu juego tiene como destino 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 larga duración 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 cuando la aplicación se inicia previamente porque la aplicación no estará visible y no será evidente por qué hay reproducción de audio.
  • Las aplicaciones no deben realizar ninguna operación durante el inicio, lo que supone que la aplicación es visible para el usuario o supone que el usuario inició explícitamente la aplicación. Dado que ahora se puede iniciar una aplicación en segundo plano sin una acción explícita del usuario, los desarrolladores deben tener en cuenta las implicaciones de privacidad, experiencia del usuario y rendimiento.
    • Una consideración de privacidad de ejemplo es cuando una aplicación social debe cambiar el estado del usuario a en línea. Debe esperar hasta que el usuario cambie a la aplicación en lugar de cambiar el estado cuando se inicie previamente la aplicación.
    • Una consideración de experiencia de usuario de ejemplo es que si tienes una aplicación, como un juego, que muestra una secuencia introductoria cuando se inicia, podrías retrasar la secuencia introductoria hasta que el usuario cambie a la aplicación.
    • Un ejemplo de implicación en el rendimiento es que podría esperar hasta que el usuario cambie a la aplicación para recuperar la información meteorológica actual en lugar de cargarla cuando la aplicación se inicie previamente y, a continuación, debe cargarla de nuevo cuando la aplicación sea visible para asegurarse de que la información es actual.
  • Si la aplicación borra su icono dinámico cuando se inicia, aplaza esto hasta que se cambie la visibilidad del evento.
  • La telemetría de la aplicación debe distinguir entre las activaciones normales de iconos y las activaciones de inicio previo para facilitar la reducción del escenario si se producen problemas.
  • Si tiene Microsoft Visual Studio 2015 Update 1 y Windows 10, versión 1511, puede simular el inicio previo de la aplicación en Visual Studio 2015 si elige Depurar>otros destinos>de depuración Depurar el inicio previo de la aplicación universal de Windows.