Gestire il preavvio dell'app

Informazioni su come gestire il preavvio dell'app eseguendo l'override del metodo OnLaunched e richiamo di CoreApplication.EnablePrelaunch.

Introduzione

Quando le risorse di sistema disponibili lo consentono, le prestazioni di avvio delle app UWP nei dispositivi della famiglia di dispositivi desktop vengono migliorate avviando in background le app usate più di frequente dell'utente. Un'app preavviata viene inserita nello stato sospeso poco dopo l'avvio. Quindi, quando l'utente richiama l'app, l'app viene ripresa portandola dallo stato sospeso allo stato in esecuzione, che è più veloce rispetto all'avvio dell'app a freddo. L'esperienza dell'utente è che l'app è stata semplicemente avviata molto rapidamente.

Prima di Windows 10, le app non sfruttano automaticamente il preavvio. In Windows 10, versione 1511, tutte le app piattaforma UWP (Universal Windows Platform) erano candidate per essere preavviate. In Windows 10 versione 1607 è necessario acconsentire esplicitamente al comportamento di preavvio chiamando CoreApplication.EnablePrelaunch e passando true. Un buon posto per mettere questa chiamata è all'interno di OnLaunched, vicino alla posizione in cui viene effettuato il controllo if (e.PrelaunchActivated == false).

L'eventuale preavvio di un'app dipende dalle risorse di sistema. Se il sistema riscontra un utilizzo elevato delle risorse, le app non vengono preavviate.

Alcuni tipi di app potrebbero dover modificare il comportamento di avvio per funzionare correttamente con il preavvio. Ad esempio, un'app che riproduce musica all'avvio; un gioco che presuppone che l'utente sia presente e visualizzi oggetti visivi elaborati all'avvio dell'app; un'app di messaggistica che modifica la visibilità online dell'utente durante l'avvio, tutte queste informazioni possono identificare quando l'app è stata preavviata e modificare il comportamento di avvio, come descritto nelle sezioni seguenti.

I modelli predefiniti per i progetti XAML (C#, VB, C++) supportano il preavvio.

Preavvio e ciclo di vita dell'app

Dopo che un'app è preavviata, passa allo stato sospeso. (vedere Gestire la sospensione dell'app).

Rilevare e gestire il preavvio

Le app ricevono il flag LaunchActivatedEventArgs.PrelaunchActivated durante l'attivazione. Usare questo flag per eseguire il codice che deve essere eseguito solo quando l'utente avvia in modo esplicito l'app, come illustrato nella modifica seguente in 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

Il metodo TryEnablePrelaunch nell'esempio di codice precedente chiama CoreApplication.EnablePrelaunch. E TryEnablePrelaunch viene chiamato solo quando l'app è in esecuzione in una versione di Windows che supporta CoreApplication.EnablePrelaunch. In generale, se c'è dubbio, è consigliabile usare un'API di Windows solo dopo aver determinato che è supportata dalla piattaforma in cui è in esecuzione il codice. E si può farlo tramite la classe ApiInformation , come illustrato nell'esempio di codice precedente.

Nell'esempio precedente è anche possibile rimuovere il commento dal codice se l'app deve rifiutare esplicitamente il preavvio quando è in esecuzione in Windows 10, versione 1511. Nella versione 1511, tutte le app UWP sono state acconsentite automaticamente al preavvio, che potrebbe non essere appropriato per l'app.

Usare l'evento VisibilityChanged

Le app attivate dal preavvio non sono visibili all'utente. Diventano visibili quando l'utente passa a loro. È possibile ritardare determinate operazioni fino a quando la finestra principale dell'app non diventa visibile. Ad esempio, se l'app visualizza un elenco delle novità di un feed, puoi aggiornare l'elenco durante l'evento VisibilityChanged anziché usare l'elenco compilato quando l'app è stata preavviata perché potrebbe diventare obsoleta dal momento in cui l'utente attiva l'app. Il codice seguente gestisce l'evento VisibilityChanged per 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
    }
}

Linee guida per i giochi DirectX

I giochi DirectX in genere non devono abilitare il preavvio perché molti giochi DirectX eseguono l'inizializzazione prima che sia possibile rilevare il preavvio. A partire da Windows 1607, Anniversary Edition, il gioco non verrà preavviato per impostazione predefinita. Se si vuole che il gioco sfrutti il preavvio, chiamare CoreApplication.EnablePrelaunch(true).

Se il gioco è destinato a una versione precedente di Windows 10, si può gestire la condizione di preavvio per uscire dall'applicazione:

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

Indicazioni generali

  • Le app non devono eseguire operazioni a esecuzione prolungata durante il preavvio perché l'app terminerà se non può essere sospesa rapidamente.
  • Le app non devono avviare la riproduzione audio da Application.OnLaunched quando l'app è preavviata perché l'app non sarà visibile e non sarà evidente perché è in corso la riproduzione audio.
  • Le app non devono eseguire alcuna operazione durante l'avvio che presupponga che l'app sia visibile all'utente o che l'app sia stata avviata in modo esplicito dall'utente. Poiché un'app può ora essere avviata in background senza azioni esplicite dell'utente, gli sviluppatori devono prendere in considerazione le implicazioni relative alla privacy, all'esperienza utente e alle prestazioni.
    • Un esempio di considerazioni sulla privacy è quando un'app di social networking deve modificare lo stato dell'utente in online. Si dovrebbe attendere fino a quando l'utente passa all'app invece di modificare lo stato quando l'app è preavviata.
    • Un esempio di considerazioni sull'esperienza utente è che se si ha un'app, ad esempio un gioco, che visualizza una sequenza introduttiva all'avvio, si potrebbe ritardare la sequenza introduttiva fino a quando l'utente passa all'app.
    • Un esempio di implicazione sulle prestazioni è che si potrebbe aspettare che l'utente passi all'app per recuperare le informazioni meteo correnti anziché caricarla quando l'app è preavviata e quindi doverla caricare di nuovo quando l'app diventa visibile per assicurarsi che le informazioni siano aggiornate.
  • Se l'app cancella il riquadro animato all'avvio, rinviare questa operazione fino a quando l'evento di visibilità non è stato modificato.
  • I dati di telemetria per l'app devono distinguere tra le normali attivazioni dei riquadri e le attivazioni di preavvio per semplificare la riduzione dello scenario in caso di problemi.
  • Se si dispone di Microsoft Visual Studio 2015 Update 1 e Windows 10, versione 1511, è possibile simulare il preavvio per l'app in Visual Studio 2015 scegliendo Debug>Altre destinazioni di debug>Plelancio dell'app Windows Universal Debug.