Behandeln des Vorabstarts von Apps

Erfahren Sie, wie Sie das Vorabstarten von Apps behandeln, indem Sie die OnLaunched-Methode überschreiben und CoreApplication.EnablePrelaunch aufrufen.

Einführung

Wenn verfügbare Systemressourcen es zulassen, wird die Startleistung von UWP-Apps auf Geräten der Desktopgerätefamilie 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 . Dies ist schneller als das kalte Starten der App. Der Benutzer gewinnt den Eindruck, dass die App sehr schnell startet.

Vor Windows 10 haben Apps nicht automatisch die Vorteile des Vorabstarts genutzt. In Windows 10, Version 1511, wurden alle UWP (Universelle Windows-Plattform)-Apps für den Vorabstart eingerichtet. In Windows 10 Version 1607 müssen Sie das Verhalten vorab starten, indem Sie CoreApplication.EnablePrelaunch aufrufen und übergebentrue. Ein guter Ort, um diesen Aufruf zu platzieren, befindet sich in OnLaunched in der Nähe des Speicherorts, an dem die if (e.PrelaunchActivated == false) Überprüfung durchgeführt wird.

Ob eine App vorab gestartet wird, ist von den Systemressourcen abhängig. Wenn das System ressourcenlastend ist, werden Apps nicht vorab gestartet.

Einige Arten von Apps müssen möglicherweise ihr Startverhalten ändern, um gut mit prelaunch zu funktionieren. Beispielsweise eine App, die Musik abspielt, wenn sie gestartet wird; ein Spiel, das davon ausgeht, dass der Benutzer vorhanden ist, und beim Starten der App aufwendige Visuals anzeigt; Eine Messaging-App, die die Online-Sichtbarkeit des Benutzers während des Startvorgangs ändert. All diese Können identifizieren, wann die App vorab gestartet wurde, und ihr Startverhalten ändern, wie in den folgenden Abschnitten beschrieben.

Die Standardvorlagen für XAML-Projekte (C#, VB, C++) können vorab gestartet werden.

Vorabstart und App-Lebenszyklus

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

Erkennen und Behandeln des Vorabstarts

Apps empfangen das LaunchActivatedEventArgs.PrelaunchActivated-Kennzeichen 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 codebeispiel oben ruft CoreApplication.EnablePrelaunch auf. TryEnablePrelaunch wird selbst nur aufgerufen, wenn die App unter einer Windows-Version ausgeführt wird, die CoreApplication.EnablePrelaunch unterstützt. Im Allgemeinen sollten Sie im Zweifelsfall eine Windows-API nur verwenden, nachdem Sie festgestellt haben, dass sie von der Plattform unterstützt wird, auf der Ihr Code ausgeführt wird. Dies können Sie mithilfe der ApiInformation-Klasse tun, wie im codebeispiel oben gezeigt.

Es gibt auch Code im obigen Beispiel, den Sie auskommentierungen 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 für den Vorabstart angemeldet, was möglicherweise nicht für Ihre App geeignet ist.

Verwenden des VisibilityChanged-Ereignisses

Eine durch den Vorabstart aktivierte App ist für den Benutzer nicht sichtbar. Sie wird sichtbar, wenn der Benutzer zur App wechselt. Möglicherweise sollen bestimmte Vorgänge verzögert werden, bis das Hauptfenster der App sichtbar wird. Wenn Ihre App z. B. eine Liste mit Neuigkeiten aus einem Feed anzeigt, können Sie die Liste während des VisibilityChanged-Ereignisses aktualisieren, anstatt eine Liste zu verwenden, die beim Vorabstart der App erstellt wurde. Denn diese kann bereits veraltet sein, 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 für DirectX-Spiele

Für DirectX-Spiele sollte der Vorabstart im Allgemeinen nicht aktiviert werden, da bei vielen DirectX-Spielen Initialisierungsvorgänge ausgeführt werden, bevor der Vorabstart erkannt wird. Ab Windows-Version 1607 (Anniversary-Edition) werden Spiele nicht standardmäßig vorab gestartet. Wenn Sie den Vorabstart für Ihr Spiel verwenden möchten, rufen Sie CoreApplication.EnablePrelaunch(true) auf.

Wenn Ihr Spiel für eine frühere Version von Windows 10 geeignet ist, können Sie den Vorabstart zum Beenden der Anwendung verwenden:

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 keine Vorgänge mit langer Ausführungsdauer ausführen, da die App beendet wird, wenn sie nicht schnell angehalten werden kann.
  • Apps sollten keine Audiowiedergabe aus Application.OnLaunched initiieren, wenn die App vorab gestartet wird, da die App nicht angezeigt wird und daher nicht offensichtlich ist, warum eine Audiowiedergabe stattfindet.
  • Apps sollten während des Starts keine Vorgänge ausführen, die voraussetzen, 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 den Datenschutz, die Benutzerfreundlichkeit und Leistung berücksichtigen.
    • Beispielsweise wird der Datenschutz beeinträchtigt, wenn eine soziale App den Benutzerstatus in „Online“ ändert. Die App sollte warten, bis der Benutzer zur App wechselt, anstatt den Status beim Vorabstart der App zu ändern.
    • Ein Negativbeispiel für die Benutzerfreundlichkeit bietet eine App, z. B. ein Spiel, die beim Start eine Einführungssequenz präsentiert. Diese Einführungssequenz sollte verzögert werden, bis der Benutzer zur App wechselt.
    • Hier ein Beispiel für eine Leistungsbeeinträchtigung: Um die aktuelle Wetterlage abzurufen, sollte gewartet werden, bis der Benutzer zur App wechselt. Die Infos sollten nicht beim Vorabstart der App geladen werden, weil sie erneut geladen werden müssen, wenn die App sichtbar wird, um sicherzustellen, dass die Informationen aktuell sind.
  • Wenn die Live-Kachel Ihrer App beim Start gelöscht wird, stellen Sie diese Aktion bis zum VisibilityChanged-Ereignis zurück.
  • Die Telemetrie für Ihre App sollte zwischen normalen Kachelaktivierungen und Vorabstartaktivierungen unterscheiden, damit eventuell auftretende Probleme leichter zu identifizieren sind.
  • 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 Debug>Other Debug Other Debug Targets>Debug Windows Universal App PreLaunch auswählen.