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

Узнайте, как обрабатывать предварительный запуск приложения, переопределив метод 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, если приложение предварительно запущено, поскольку оно не будет видимым, и будет непонятно, почему воспроизводится звук.
  • Приложения не должны выполнять во время запуска действия, которые предполагают, что приложение отображается для пользователя, или предполагают, что приложение было явно запущено пользователем. Поскольку приложение теперь может быть запущено в фоновом режиме без явных действий пользователя, разработчики должны учитывать влияние конфиденциальности, взаимодействия с пользователем и производительности.
    • Пример вопроса конфиденциальности: социальное приложение должно изменить статус пользователя на статус "В сети". Оно должно ждать, пока пользователь не переключится на приложение, а не менять статус пользователя при предварительном запуске.
    • Пример создания взаимодействия с пользователем: если у вас есть приложение (например, игра), которая показывает вводную последовательность при запуске, можно отложить выполнение вводной последовательности до момента, пока пользователь не переключится на это приложение.
    • Пример влияния на производительность: можно ждать, пока пользователь не переключится на приложение, чтобы восстановить текущие сведения о погоде, вместо того, чтобы загружать их при предварительном запуске приложения, а затем загружать их снова, когда приложение станет видимым, чтобы убедиться, что отображаются последние сведения.
  • Если приложение при запуске очищает живую плитку, отложите это действие до события смены видимости.
  • Телеметрия вашего приложения должна различать обычную активацию плиток и активацию при предварительном запуске, чтобы упростить поиск сценария, если возникает неполадка.
  • Если у вас есть Microsoft Visual Studio 2015 с обновлением 1 и Windows 10 версии 1511, вы можете имитировать предварительный запуск приложения в Visual Studio 2015, выбрав Отладка>других целей> отладкиОтладка универсального приложения Windows Перед запуском.