Partilhar via


Gerir a pré-inicialização do aplicativo

Saiba como lidar com a pré-inicialização do aplicativo substituindo o método OnLaunched e chamando CoreApplication.EnablePrelaunch.

Introdução

Quando os recursos do sistema disponíveis permitem, o desempenho de inicialização de aplicativos UWP em dispositivos da família de dispositivos desktop é melhorado iniciando proativamente os aplicativos usados com mais frequência do usuário em segundo plano. Um aplicativo pré-lançado é colocado no estado suspenso logo após ser iniciado. Em seguida, quando o usuário invoca o aplicativo, ele é retomado trazendo-o do estado suspenso para o estado de execução, o que é mais rápido do que iniciar o aplicativo frio. A experiência do usuário é que o aplicativo simplesmente foi iniciado muito rapidamente.

Antes do Windows 10, as aplicações não tiravam automaticamente partido do pré-lançamento. No Windows 10, versão 1511, todos os aplicativos da Plataforma Universal do Windows (UWP) eram candidatos a serem pré-lançados. No Windows 10, versão 1607, você deve optar pelo comportamento de pré-lançamento chamando CoreApplication.EnablePrelaunch e passando true. Um bom lugar para colocar esta chamada é dentro do OnLaunched, perto do local onde a verificação if (e.PrelaunchActivated == false) é feita.

Se um aplicativo é pré-iniciado depende dos recursos do sistema. Se o sistema estiver sofrendo pressão de recursos, os aplicativos não serão pré-iniciados.

Alguns tipos de aplicativos podem precisar alterar seu comportamento de inicialização para funcionar bem com o pré-lançamento. Por exemplo, uma aplicação que reproduz música quando é iniciada; um jogo que assume que o usuário está presente e exibe visuais elaborados quando o aplicativo é iniciado; Um aplicativo de mensagens que altera a visibilidade online do usuário durante a inicialização — todos eles podem identificar quando o aplicativo foi pré-iniciado e podem alterar seu comportamento de inicialização, conforme descrito nas seções abaixo.

Os modelos padrão para projetos XAML (C#, VB, C++) acomodam o pré-lançamento.

Pré-lançamento e ciclo de vida do aplicativo

Depois que um aplicativo é pré-iniciado, ele entra no estado suspenso. (consulte Lidar com a suspensão de aplicações).

Detetar e gerir o pré-lançamento

Os aplicativos recebem o flag LaunchActivatedEventArgs.PrelaunchActivated durante a ativação. Use esse sinalizador para executar o código que só deve ser executado quando o usuário iniciar explicitamente o aplicativo, conforme mostrado na seguinte modificação para 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

O método TryEnablePrelaunch no exemplo de código acima chama CoreApplication.EnablePrelaunch. E TryEnablePrelaunch é chamado apenas quando a aplicação está a correr numa versão do Windows que suporta CoreApplication.EnablePrelaunch. Em geral, se houver alguma dúvida, você deve usar uma API do Windows somente depois de determinar que ela é suportada pela plataforma em que seu código está sendo executado. E você pode fazer isso por meio da classe ApiInformation , como mostrado no exemplo de código acima.

Há também um código no exemplo acima que você pode cancelar o comentário se seu aplicativo precisar desativar o pré-lançamento ao ser executado no Windows 10, versão 1511. Na versão 1511, todos os aplicativos UWP foram automaticamente aceitos para o pré-lançamento, o que pode não ser apropriado para seu aplicativo.

Utilize o evento VisibilityChanged

As aplicações ativadas pelo pré-lançamento não são visíveis para o utilizador. Eles se tornam visíveis quando o usuário muda para eles. Talvez você queira adiar determinadas operações até que a janela principal do seu aplicativo fique visível. Por exemplo, se a sua aplicação exibir uma lista de itens novos de um feed, poderá atualizá-la durante o evento VisibilityChanged em vez de usar a lista criada quando a aplicação foi pré-lançada, pois ela pode ficar desatualizada no momento em que o utilizador ativa a aplicação. O seguinte código lida com o evento VisibilityChanged para a 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
    }
}

Guia de Jogos DirectX

Os jogos DirectX geralmente não devem habilitar a pré-inicialização porque muitos jogos DirectX fazem sua inicialização antes que a pré-inicialização possa ser detetada. A partir do Windows 1607, edição de aniversário, seu jogo não será pré-iniciado por padrão. Se quiseres que o teu jogo aproveite o pré-lançamento, ativa CoreApplication.EnablePrelaunch(true).

Se o seu jogo tiver como alvo uma versão anterior do Windows 10, pode lidar com a condição de pré-lançamento para sair da aplicação:

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;
        }
    }
}

Orientações gerais

  • Os aplicativos não devem executar operações de longa duração durante a pré-inicialização porque o aplicativo será encerrado se não puder ser suspenso rapidamente.
  • As aplicações não devem iniciar a reprodução de áudio de Application.OnLaunched quando a aplicação é pré-iniciada, porque a aplicação não estará visível e não será claro por que está a ser reproduzido áudio.
  • Os aplicativos não devem executar nenhuma operação durante a inicialização que pressuponha que o aplicativo esteja visível para o usuário ou que o aplicativo foi explicitamente iniciado pelo usuário. Como um aplicativo agora pode ser iniciado em segundo plano sem ação explícita do usuário, os desenvolvedores devem considerar as implicações de privacidade, experiência do usuário e desempenho.
    • Um exemplo de consideração de privacidade é quando um aplicativo social deve alterar o estado do usuário para online. Deve esperar até que o utilizador mude para a aplicação em vez de alterar o estado quando a aplicação estiver pré-lançada.
    • Um exemplo de consideração da experiência do usuário é que, se você tiver um aplicativo, como um jogo, que exibe uma sequência introdutória quando é iniciado, você pode atrasar a sequência introdutória até que o usuário alterne para o aplicativo.
    • Um exemplo de implicação de desempenho é que você pode esperar até que o usuário alterne para o aplicativo para recuperar as informações meteorológicas atuais em vez de carregá-las quando o aplicativo for pré-iniciado e, em seguida, precisar carregá-las novamente quando o aplicativo se tornar visível para garantir que as informações estejam atualizadas.
  • Se o seu aplicativo limpar o Live Tile ao ser iniciado, adie isso até que o evento de alteração de visibilidade ocorra.
  • A telemetria do seu aplicativo deve distinguir entre ativações de tiles normais e ativações de pré-lançamento para facilitar a identificação do cenário caso ocorram problemas.
  • Se tiveres o Microsoft Visual Studio 2015 Update 1 e o Windows 10, Versão 1511, podes simular o pré-lançamento da aplicação no Visual Studio 2015 escolhendo Depurar>Outros Destinos de Depuração>Debug Windows Universal App PreLaunch.