Behandeln des Vorabstarts von Apps

Erfahren Sie, wie Sie den Vorabstart der App behandeln, indem Sie die OnLaunched-Methode außer Kraft setzen und CoreApplication.EnablePrelaunch aufrufen.

Einführung

Wenn verfügbare Systemressourcen zulassen, wird die Startleistung von UWP-Apps auf Desktopgerätefamiliengeräten verbessert, indem die am häufigsten verwendeten Apps des Benutzers proaktiv im Hintergrund gestartet werden. Eine vorab gestartete App wird kurz nach dem Start in den angehaltenen Zustand versetzt. Wenn der Benutzer die App dann aufruft, wird die App fortgesetzt, indem sie aus dem angehaltenen Zustand in den Ausführungszustand versetzt wird , was schneller als das Starten der App kalt ist. Die Benutzererfahrung besteht darin, dass die App einfach sehr schnell gestartet wurde.

Vor Windows 10 nutzten Apps den Vorabstart nicht automatisch. In Windows 10, Version 1511, waren alle Universelle Windows-Plattform (UWP)-Apps kandidaten für den Vorabstart. In Windows 10, Version 1607, müssen Sie sich für das Vorabstartverhalten anmelden, indem Sie CoreApplication.EnablePrelaunch aufrufen und übergebentrue. Ein guter Ort, um diesen Anruf zu tätigen, befindet sich in der Nähe des Orts, an dem die if (e.PrelaunchActivated == false) Prüfung durchgeführt wird.

Ob eine App vorab gestartet wird, hängt von den Systemressourcen ab. Wenn der Ressourcendruck des Systems auftritt, werden Apps nicht vorab gestartet.

Einige Arten von Apps müssen möglicherweise ihr Startverhalten ändern, um mit dem Vorabstart gut zu arbeiten. Beispielsweise eine App, die beim Starten Musik wiedergibt; ein Spiel, das davon ausgeht, dass der Benutzer vorhanden ist, und zeigt beim Starten der App aufwendige visuelle Elemente an. eine Messaging-App, die die Onlinesichtbarkeit des Benutzers während des Starts ändert – all diese können erkennen, wann die App vorab gestartet wurde, und das Startverhalten ändern, wie in den folgenden Abschnitten beschrieben.

Die Standardvorlagen für XAML-Projekte (C#, VB, C++) unterstützen den Vorabstart.

Vorabstart und App-Lebenszyklus

Nachdem eine App vorab gestartet wurde, wechselt sie in den angehaltenen Zustand. (siehe Behandeln des Anhaltens der App).

Erkennen und Behandeln des Vorabstarts

Apps erhalten das LaunchActivatedEventArgs.PrelaunchActivated-Flag während der Aktivierung. Verwenden Sie dieses Flag, um Code auszuführen, der nur ausgeführt werden soll, wenn der Benutzer die App explizit startet, wie in der folgenden Änderung an Application.OnLaunched gezeigt.

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

Wichtig

Die TryEnablePrelaunch-Methode im obigen Codebeispiel ruft CoreApplication.EnablePrelaunch auf. Und TryEnablePrelaunch wird nur aufgerufen, wenn die App auf einer Version von Windows ausgeführt wird, die CoreApplication.EnablePrelaunch unterstützt. Im Allgemeinen sollten Sie bei Zweifeln eine Windows-API nur verwenden, nachdem Sie festgestellt haben, dass sie von der Plattform unterstützt wird, auf der Ihr Code ausgeführt wird. Und sie können dies mithilfe der ApiInformation-Klasse tun, wie im obigen Codebeispiel gezeigt.

Es gibt auch Code im obigen Beispiel, dass Sie kommentare aufheben können, wenn Ihre App den Vorabstart deaktivieren muss, wenn sie unter Windows 10, Version 1511, ausgeführt wird. In Version 1511 wurden alle UWP-Apps automatisch zum Vorabstart angemeldet, was für Ihre App möglicherweise nicht geeignet ist.

Verwenden des VisibilityChanged-Ereignisses

Apps, die durch den Vorabstart aktiviert werden, sind für den Benutzer nicht sichtbar. Sie werden sichtbar, wenn der Benutzer zu ihnen wechselt. Möglicherweise möchten Sie bestimmte Vorgänge verzögern, bis das Hauptfenster der App sichtbar wird. Wenn Ihre App z. B. eine Liste der neuen Elemente aus einem Feed anzeigt, können Sie die Liste während des VisibilityChanged-Ereignisses aktualisieren, anstatt die Liste zu verwenden, die beim Vorabstart der App erstellt wurde, da sie möglicherweise veraltet werden kann, wenn der Benutzer die App aktiviert. Der folgende Code behandelt das VisibilityChanged-Ereignis für 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
    }
}

Leitfaden zu DirectX-Spielen

DirectX-Spiele sollten im Allgemeinen den Vorabstart nicht aktivieren, da viele DirectX-Spiele ihre Initialisierung durchführen, bevor der Vorabstart erkannt werden kann. Ab Windows 1607, Anniversary Edition, wird Ihr Spiel nicht standardmäßig vorab gestartet. Wenn Sie möchten, dass Ihr Spiel den Vorabstart nutzt, rufen Sie CoreApplication.EnablePrelaunch(true) auf.

Wenn Ihr Spiel auf eine frühere Version von Windows 10 ausgerichtet ist, können Sie die Vorabstartbedingung behandeln, um die Anwendung zu beenden:

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

Allgemeine Hinweise

  • Apps sollten während des Vorabstarts nicht lange ausgeführte Vorgänge ausführen, da die App beendet wird, wenn sie nicht schnell angehalten werden kann.
  • Apps sollten die Audiowiedergabe von Application.OnLaunched nicht initiieren, wenn die App vorab gestartet wird, da die App nicht sichtbar ist und nicht offensichtlich ist, warum Audio wiedergegeben wird.
  • Apps sollten während des Starts keine Vorgänge ausführen, die davon ausgehen, dass die App für den Benutzer sichtbar ist, oder davon ausgehen, dass die App explizit vom Benutzer gestartet wurde. Da eine App jetzt ohne explizite Benutzeraktion im Hintergrund gestartet werden kann, sollten Entwickler die Auswirkungen auf Datenschutz, Benutzerfreundlichkeit und Leistung berücksichtigen.
    • Ein Beispiel für die Datenschutzüberlegung ist, wenn eine soziale App den Benutzerstatus in "Online" ändern sollte. Es sollte warten, bis der Benutzer zur App wechselt, anstatt den Status zu ändern, wenn die App vorab gestartet wird.
    • Ein Beispiel für die Benutzerfreundlichkeit besteht darin, dass Sie bei einer App, z. B. einem Spiel, eine Einführungssequenz beim Starten anzeigen, die Einführungssequenz verzögern können, bis der Benutzer zur App wechselt.
    • Ein Beispiel für eine Leistungsimplikation besteht darin, dass Sie warten können, bis der Benutzer zur App wechselt, um die aktuellen Wetterinformationen abzurufen, anstatt sie zu laden, wenn die App vorab gestartet wird, und sie dann erneut laden müssen, wenn die App sichtbar wird, um sicherzustellen, dass die Informationen aktuell sind.
  • Wenn Ihre App die Live-Kachel beim Starten löscht, verzögern Sie dies, bis das Sichtbarkeitsereignis geändert wurde.
  • Telemetrie für Ihre App sollte zwischen normalen Kachelaktivierungen und Vorabstartaktivierungen unterscheiden, um das Szenario zu vereinfachen, wenn Probleme auftreten.
  • Wenn Sie über Microsoft Visual Studio 2015 Update 1 und Windows 10, Version 1511, verfügen, können Sie den Vorabstart für Ihre App in Visual Studio 2015 simulieren, indem Sie "Debuggen anderer Debugziele>Debuggen von Windows Universal App PreLaunch">auswählen.