アプリの事前起動の処理Handle app prelaunch

OnLaunched メソッドをオーバーライドすることで、アプリの事前起動を処理する方法について説明します。Learn how to handle app prelaunch by overriding the OnLaunched method.

はじめにIntroduction

利用可能なシステム リソースには、事前にバック グラウンドでのユーザーの最も頻繁に使うアプリを起動してデスクトップ デバイス ファミリのデバイス上の UWP アプリの起動時のパフォーマンスが向上します。When available system resources allow, the startup performance of UWP apps on desktop device family devices is improved by proactively launching the user’s most frequently used apps in the background. 事前起動されたアプリは起動直後に中断状態になります。A prelaunched app is put into the suspended state shortly after it is launched. その後、ユーザーがアプリを呼び出すと、アプリは中断状態から実行状態に移って再開されます。これは、アプリのコールド スタートよりも高速です。Then, when the user invokes the app, the app is resumed by bringing it from the suspended state to the running state--which is faster than launching the app cold. ユーザーのエクスペリエンスとしては、アプリが非常に短時間で起動するように感じられます。The user's experience is that the app simply launched very quickly.

Windows 10 より前では、アプリは自動的には事前起動を利用しませんでした。Prior to Windows 10, apps did not automatically take advantage of prelaunch. Windows 10 バージョン 1511 では、すべてのユニバーサル Windows プラットフォーム (UWP) アプリが事前起動の候補をでした。In Windows10, version 1511, all Universal Windows Platform (UWP) apps were candidates for being prelaunched. Windows 10 バージョン 1607 では、CoreApplication.EnablePrelaunch(true) を呼び出すことで、事前起動の動作にオプトインする必要があります。In Windows 10, version 1607, you must opt-in to prelaunch behavior by calling CoreApplication.EnablePrelaunch(true). この呼び出しを配置する最適な場所は、OnLaunched() 内の if (e.PrelaunchActivated == false) チェックが実行される位置の近くです。A good place to put this call is within OnLaunched() near the location that the if (e.PrelaunchActivated == false) check is made.

アプリが事前起動されるかどうかは、システム リソースに応じて決まります。Whether an app is prelaunched depends on system resources. システムのリソースに負荷が掛かっている場合、アプリは事前起動されません。If the system is experiencing resource pressure, apps are not prelaunched.

アプリの種類によっては、事前起動を利用するために、起動の動作の変更が必要になる場合があります。Some types of apps may need to change their startup behavior to work well with prelaunch. たとえば、起動時に音楽を再生するアプリ、ユーザーがオンラインであることを想定してアプリの起動時に凝ったビジュアルを表示するゲーム、起動時にユーザーのオンライン状態を変更するメッセージング アプリは、アプリが事前起動したことを識別し、以下の説明のとおり起動の動作を変更できます。For example, an app that plays music when its starts up, a game which assumes the user is present and displays elaborate visuals when the app starts up, a messaging app that changes the user's online visibility during startup, can identify when the app was prelaunched and can change their startup behavior as described in the sections below.

XAML プロジェクト (C#、VB、C++) と WinJS の既定のテンプレートは、Visual Studio 2015 Update 3 で事前起動に対応します。The default templates for XAML Projects (C#, VB, C++) and WinJS accommodate prelaunch in Visual Studio 2015 Update 3.

事前起動とアプリのライフサイクルPrelaunch and the app lifecycle

アプリは、事前起動された後すぐに中断状態になります。After an app is prelaunched, it will enter the suspended state. (「アプリの中断の処理」をご覧ください。)(see Handle app suspend).

事前起動の検出と処理Detect and handle prelaunch

アプリはアクティブ化中に LaunchActivatedEventArgs.PrelaunchActivated フラグを受け取ります。Apps receive the LaunchActivatedEventArgs.PrelaunchActivated flag during activation. このフラグを使用する必要がありますのみを実行しているユーザーが明示的に、アプリを起動したときApplication.OnLaunched変更が次に示すようにコードを実行します。Use this flag to run code that should only run when the user explicitly launches the app, as shown in the following modification to 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>
/// Encapsulates the call to CoreApplication.EnablePrelaunch() so that the JIT
/// won't encounter that call (and prevent the app from running when it doesn't
/// find it), unless this method gets called. This method should only
/// be called when the caller determines that we are running on a system that
/// supports CoreApplication.EnablePrelaunch().
/// </summary>
private void TryEnablePrelaunch()
{
    Windows.ApplicationModel.Core.CoreApplication.EnablePrelaunch(true);
}

注:、TryEnablePrelaunch()関数で、上記のします。Note the TryEnablePrelaunch() function, above. 理由の呼び出しをCoreApplication.EnablePrelaunch()に関しては、この関数には、メソッドが呼び出されたとき (だけでコンパイル) JIT はしようとするとメソッド全体をコンパイルするためです。The reason the call to CoreApplication.EnablePrelaunch() is factored out into this function is because when a method is called, the JIT (just in time compilation) will attempt to compile the entire method. アプリがサポートされていない Windows 10 のバージョンで実行されているかどうかはCoreApplication.EnablePrelaunch()、JIT は失敗します。If your app is running on a version of Windows 10 that doesn't support CoreApplication.EnablePrelaunch(), then the JIT will fail. アプリをプラットフォームをサポートしているときにのみ呼び出されるメソッドの呼び出しを考慮することによってCoreApplication.EnablePrelaunch()、問題を回避します。By factoring the call into a method that is only called when the app determines that the platform supports CoreApplication.EnablePrelaunch(), we avoid that problem.

アプリがオプトアウト事前起動の Windows 10 バージョン 1511 で実行されているときする必要があるかどうかはコメント解除できる上記の例でもコードがあります。There is also code in the example above that you can uncomment if your app needs to opt-out of prelaunch when running on Windows 10, version 1511. バージョン 1511 では、すべての UWP アプリはオプトインが自動的に事前起動されるできない可能性があるアプリの適切なします。In version 1511, all UWP apps were automatically opted into prelaunch, which may not be appropriate for your app.

VisibilityChanged イベントの使用Use the VisibilityChanged event

事前起動によってアクティブ化されたアプリはユーザーに対して表示されません。Apps activated by prelaunch are not visible to the user. ユーザーがそれらのアプリに切り替えると表示されます。They become visible when the user switches to them. アプリのメイン ウィンドウが表示されるまで、特定の操作を遅らせることが必要になる場合があります。You may want to delay certain operations until your app's main window becomes visible. たとえば、アプリによってフィードからの新着アイテムの一覧が表示される場合は、VisibilityChanged イベントの発生時に一覧を更新できます。アプリの事前起動時に生成された一覧は使いません。ユーザーがアプリをアクティブ化するまでに、その一覧が古くなっている可能性があるためです。For example, if your app displays a list of what's new items from a feed, you could update the list during the VisibilityChanged event rather than use the list that was built when the app was prelaunched because it may become stale by the time the user activates the app. 次のコードは、MainPageVisibilityChanged イベントを処理します。The following code handles the VisibilityChanged event for 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 games guidance

DirectX ゲームは、一般に、事前起動を有効にしないでください。多くの DirectX ゲームは、事前起動を検出できるより前に初期化を実行するためです。DirectX games should generally not enable prelaunch because many DirectX games do their initialization before prelaunch can be detected. Windows 1607 (Anniversary エディション) 以降では、ゲームは既定で事前起動されません。Starting with Windows 1607, Anniversary edition, your game will not be prelaunched by default. ゲームで事前起動を利用する必要がある場合は、CoreApplication.EnablePrelaunch(true) を呼び出します。If you do want your game to take advantage of prelaunch, call CoreApplication.EnablePrelaunch(true).

以前のバージョンの Windows 10 をターゲットとするゲームでは、事前起動の条件を処理してアプリケーションを終了することができます。If your game targets an earlier version of Windows 10, you can handle the prelaunch condition to exit the application:

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

WinJS アプリのガイダンスWinJS app guidance

以前のバージョンの Windows 10 をターゲットとする WinJS アプリでは、onactivated ハンドラー内で事前起動の条件を処理することができます。If your WinJS app targets an earlier version of Windows 10, you can handle the prelaunch condition in your onactivated handler:

    app.onactivated = function (args) {
        if (!args.detail.prelaunchActivated) {
            // 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.
        }
    }

一般的なガイダンスGeneral Guidance

  • 長時間かかる操作を、アプリが事前起動時に実行しないようにしてください。アプリはすぐに中断状態に移れない場合に終了するためです。Apps should not perform long running operations during prelaunch because the app will terminate if it can't be suspended quickly.
  • アプリが事前起動された場合、アプリは Application.OnLaunched からオーディオの再生を開始しません。アプリは表示されず、オーディオ再生が行われる理由がはっきりしないためです。Apps should not initiate audio playback from Application.OnLaunched when the app is prelaunched because the app won't be visible and it won't be apparent why there is audio playing.
  • アプリがユーザーに表示されていることを前提とした操作やユーザーによって明示的に起動されたことを前提とした操作を、アプリが事前起動時に実行しないようにしてください。Apps should not perform any operations during launch which assume that the app is visible to the user, or assume that the app was explicitly launched by the user. アプリはユーザーによる明示的な操作なしにバックグラウンドで起動できるようになったため、開発者はプライバシー、ユーザー エクスペリエンス、パフォーマンスへの影響を配慮する必要があります。Because an app can now be launched in the background without explicit user action, developers should consider the privacy, user experience and performance implications.
    • プライバシーの配慮の一例は、ソーシャル アプリがユーザーの状態をオンラインに変更する場合です。An example privacy consideration is when a social app should change the user state to online. アプリの事前起動時に状態を変更せずに、ユーザーがそのアプリに切り替えるまで待機する必要があります。It should wait until the user switches to the app instead of changing the status when the app is prelaunched.
    • ユーザー エクスペリエンスの配慮の一例は、ゲームなどのアプリが起動時に導入シーケンスを表示する場合です。ユーザーがアプリに切り替えるまでそのシーケンスを遅らせる必要があります。An example user experience consideration is that if you have an app, such as a game, that displays an introductory sequence when it is launched, you might delay the introductory sequence until the user switches to the app.
    • パフォーマンスの配慮の一例は、アプリの事前起動時に最新の気象情報を読み込む場合です。ユーザーがアプリに切り替えるまでその読み込みを遅らせて、アプリが表示されたら最新の情報を読み込む必要があります。An example performance implication is that you might wait until the user switches to the app to retrieve the current weather information instead of loading it when the app is prelaunched and then need to load it again when the app becomes visible to ensure that the information is current.
  • アプリが起動時にライブ タイルをクリアする場合、表示の変更イベントが発生するまでこの操作の実行を遅らせてください。If your app clears its Live Tile when launched, defer doing this until the visibility changed event.
  • アプリの利用統計情報をタイルの通常のアクティブ化と事前起動時のアクティブ化で区別して、問題が発生する場合のシナリオを容易に絞り込めるようにしてください。Telemetry for your app should distinguish between normal tile activations and prelaunch activations to make it easier to narrow down the scenario if problems occur.
  • Microsoft Visual の Studio2015 Update 1 と windows 10、バージョン 1511 では、ある場合をシミュレートできます事前起動の Visual Studio2015 でアプリのデバッグを選択して>その他のデバッグ ターゲット > Windows ユニバーサル アプリのデバッグ事前起動します。If you have Microsoft Visual Studio2015 Update 1, and Windows10, Version 1511, you can simulate prelaunch for App your app in Visual Studio2015 by choosing Debug > Other Debug Targets > Debug Windows Universal App PreLaunch.