Поделиться через


Обработка предварительного запуска приложения

Узнайте, как обрабатывать предварительное запуск приложения, переопределяя метод OnLaunched и вызывая CoreApplication.EnablePrelaunch.

Введение

Если доступны системные ресурсы позволяют, производительность запуска приложений UWP на классических устройствах улучшается путем упреждающего запуска наиболее часто используемых приложений пользователя в фоновом режиме. Предварительно запущенное приложение помещается в приостановленное состояние вскоре после запуска. Затем, когда пользователь вызывает приложение, приложение возобновляется, приведя его из приостановленного состояния в состояние выполнения, что быстрее, чем запуск приложения холодным. Взаимодействие с пользователем заключается в том, что приложение просто запустило очень быстро.

До Windows 10 приложения не автоматически воспользовались предварительным запуском. В Windows 10 версии 1511 все приложения универсальная платформа Windows (UWP) были кандидатами на предварительное запуск. В Windows 10 версии 1607 необходимо принять участие в предварительном запуске, вызвав CoreApplication.EnablePrelaunch и передаваяtrue. Хорошее место для размещения этого вызова находится в OnLaunched, недалеко от расположения, которое if (e.PrelaunchActivated == false) выполняется проверка.

Зависит ли предварительное запуск приложения от системных ресурсов. Если в системе возникает давление на ресурсы, приложения не запускаются заранее.

Некоторым типам приложений может потребоваться изменить их поведение запуска, чтобы хорошо работать с предварительной загрузкой. Например, приложение, которое воспроизводит музыку при запуске; игра, предполагающая, что пользователь присутствует, и отображает сложные визуальные элементы при запуске приложения; Приложение для обмена сообщениями, которое изменяет видимость пользователя в Интернете во время запуска, все из них могут определить, когда приложение было предварительно запущено, и может изменить его поведение запуска, как описано в разделах ниже.

Шаблоны по умолчанию для проектов XAML (C#, VB, C++) размещаются перед запуском.

Предварительный запуск и жизненный цикл приложения

После предварительного запуска приложения он вводит приостановленное состояние. (см. раздел Обработка приостановки приложения).

Обнаружение и обработка предварительного запуска

Приложения получают флаг LaunchActivatedEventArgs.PrelaunchActivated во время активации. Используйте этот флаг для запуска кода, который должен выполняться только при явном запуске приложения, как показано в следующем изменении 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);
}

Внимание

Метод TryEnablePrelaunch в приведенном выше примере кода вызывает CoreApplication.EnablePrelaunch. И TryEnablePrelaunch вызывается только в том случае, если приложение работает в версии Windows, поддерживающей CoreApplication.EnablePrelaunch. В целом, если есть какие-либо сомнения, следует использовать API Windows только после определения того, что она поддерживается платформой, на которую работает ваш код. И это можно сделать с помощью класса ApiInformation , как показано в приведенном выше примере кода.

В приведенном выше примере также можно раскомментировать код, если приложение должно отказаться от предварительного запуска при запуске в Windows 10 версии 1511. В версии 1511 все приложения UWP были автоматически выбраны для предварительного запуска, что может не соответствовать вашему приложению.

Использование события VisibilityChanged

Приложения, активированные предварительной активацией, не отображаются пользователю. Они становятся видимыми, когда пользователь переключается на них. Может потребоваться отложить определенные операции, пока главное окно приложения не станет видимым. Например, если приложение отображает список новых элементов из веб-канала, вы можете обновить список во время события VisibilityChanged , а не использовать список, созданный при предварительном запуске приложения, так как он может стать устаревшим к тому времени, когда пользователь активирует приложение. Следующий код обрабатывает событие VisibilityChanged для 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
    }
}

Руководство по играм DirectX

Игры DirectX, как правило, не должны включать предварительную запуск, так как многие игры DirectX делают их инициализацию перед обнаружением предварительного запуска. Начиная с Windows 1607, юбилейный выпуск, ваша игра не будет предварительно запущена по умолчанию. Если вы хотите, чтобы ваша игра воспользовались предварительным запуском, вызовите CoreApplication.EnablePrelaunch(true).

Если ваша игра нацелена на более раннюю версию Windows 10, вы можете обработать условие предварительного запуска, чтобы выйти из приложения:

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

Общее руководство

  • Приложения не должны выполнять длительные операции во время предварительного запуска, так как приложение завершится, если оно не может быть приостановлено быстро.
  • Приложения не должны инициировать воспроизведение звука из Application.OnLaunched при предварительном запуске приложения, так как приложение не будет видимым, и это не будет очевидно, почему есть воспроизведение звука.
  • Приложения не должны выполнять никаких операций во время запуска, предполагая, что приложение отображается пользователю или предполагается, что приложение было явно запущено пользователем. Так как теперь приложение может быть запущено в фоновом режиме без явного действия пользователя, разработчики должны учитывать конфиденциальность, взаимодействие с пользователем и производительность.
    • Примером конфиденциальности является то, когда социальное приложение должно изменить состояние пользователя на интернет. Он должен ждать, пока пользователь не перейдет в приложение, а не измените состояние при предварительном запуске приложения.
    • Примером взаимодействия с пользователем является то, что если у вас есть приложение, например игра, которая отображает вводную последовательность при запуске, вы можете отложить вводную последовательность до тех пор, пока пользователь не перейдет в приложение.
    • Пример влияния на производительность заключается в том, что вы можете ждать, пока пользователь не перейдет к приложению, чтобы получить текущую информацию о погоде, а не загружать ее при предварительном запуске приложения, а затем необходимо загрузить его еще раз, когда приложение становится видимым, чтобы убедиться, что информация является текущей.
  • Если приложение очищает плитку Live при запуске, отложите это до тех пор, пока не изменится событие видимости.
  • Данные телеметрии для приложения должны различать обычные активации плиток и предварительные активации, чтобы упростить сузить сценарий при возникновении проблем.
  • Если у вас есть Microsoft Visual Studio 2015 с обновлением 1 и Windows 10 версии 1511, вы можете имитировать предварительное запуск приложения в Visual Studio 2015, выбрав отладку>других целевых объектов>отладки универсальных приложений Windows.