アプリの事前起動の処理

OnLaunched メソッドをオーバーライドし、CoreApplication.EnablePrelaunch を呼び出して、アプリの事前起動を処理する方法について説明します。

はじめに

システム リソースが許す限り、ユーザーの最も頻繁に使うアプリを事前にバックグラウンドで起動することで、デスクトップ デバイス ファミリのデバイスにおける UWP アプリの起動時のパフォーマンスが向上します。 事前起動されたアプリは起動直後に中断状態になります。 その後、ユーザーがアプリを呼び出すと、アプリは中断状態から実行中の状態に移行することで再開されます。これは、アプリのコールド起動よりも高速です。 ユーザーのエクスペリエンスとしては、アプリが非常に短時間で起動するように感じられます。

Windows 10より前のバージョンでは、アプリは自動的に事前起動を利用しませんでした。 Windows 10 バージョン 1511 では、すべてのユニバーサル Windows プラットフォーム (UWP) アプリが、事前起動の候補でした。 バージョン 1607 Windows 10では、CoreApplication.EnablePrelaunch を呼び出して を渡trueすことで、事前起動動作をオプトインする必要があります。 この呼び出しを行うのに適した場所は、チェックが行われる場所のif (e.PrelaunchActivated == false)近くにある OnLaunched 内にあります。

アプリが事前起動されるかどうかは、システム リソースに応じて決まります。 システムでリソースの負荷が発生している場合、アプリは事前に起動されません。

一部の種類のアプリでは、事前起動を適切に動作させるために、スタートアップ動作を変更する必要がある場合があります。 たとえば、起動時に音楽を再生するアプリなどです。ユーザーが存在することを前提とし、アプリの起動時に詳細なビジュアルを表示するゲーム。起動中にユーザーのオンライン可視性を変更するメッセージング アプリ。これらのすべてがアプリが事前起動されたタイミングを識別でき、以下のセクションで説明するようにスタートアップ動作を変更できます。

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 自体は、CoreApplication.EnablePrelaunch をサポートするバージョンの Windows でアプリが実行されている場合にのみ呼び出されます。 一般に、疑いがある場合は、 コードが実行されているプラットフォームでサポートされていることを判断した後にのみ、Windows API を使用する必要があります。 また、上記のコード例に示すように、 ApiInformation クラスを使用してこれを行うことができます。

上記の例には、Windows 10 バージョン 1511 で実行するときにアプリが事前起動をオプトアウトする必要がある場合にコメントを解除できるコードもあります。 バージョン 1511 では、すべての UWP アプリが自動的に事前起動にオプトインされました。これは、アプリに適していない可能性があります。

VisibilityChanged イベントの使用

事前起動によってアクティブ化されたアプリはユーザーに対して表示されません。 ユーザーがそれらのアプリに切り替えると表示されます。 アプリのメイン ウィンドウが表示されるまで、特定の操作を遅らせることが必要になる場合があります。 たとえば、アプリによってフィードからの新着アイテムの一覧が表示される場合は、VisibilityChanged イベントの発生時に一覧を更新できます。アプリの事前起動時に生成された一覧は使いません。ユーザーがアプリをアクティブ化するまでに、その一覧が古くなっている可能性があるためです。 次のコードは、MainPageVisibilityChanged イベントを処理します。

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 (Anniversary エディション) 以降では、ゲームは既定で事前起動されません。 ゲームで事前起動を利用する必要がある場合は、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 Update 1 とバージョン 1511 Windows 10がある場合は、[デバッグ>] [その他のデバッグ ターゲット>] [デバッグ] [Windows ユニバーサル アプリの事前起動] の順に選択して、Visual Studio 2015 でアプリの事前起動をシミュレートできます。