アプリの事前起動の処理
OnLaunched メソッドをオーバーライドし、CoreApplication.EnablePrelaunch を呼び出して、アプリの事前起動を処理する方法について説明します。
はじめに
システム リソースが許す限り、ユーザーの最も頻繁に使うアプリを事前にバックグラウンドで起動することで、デスクトップ デバイス ファミリのデバイスにおける UWP アプリの起動時のパフォーマンスが向上します。 事前起動されたアプリは、起動直後に中断状態になります。 その後、ユーザーがアプリを呼び出すと、アプリは中断状態から実行中の状態に移行することで再開されます。これは、アプリをコールド起動するよりも高速です。 ユーザーのエクスペリエンスは、アプリが非常に迅速に起動されたという点です。
Windows 10 より前のバージョンでは、アプリは自動的に事前起動を利用しませんでした。 Windows 10 バージョン 1511 では、すべてのユニバーサル Windows プラットフォーム (UWP) アプリが事前起動の候補でした。 Windows 10 バージョン 1607 では、 CoreApplication.EnablePrelaunch を呼び出し、 true
を渡すことによって、事前起動動作をオプトインする必要があります。 この呼び出しを行うのに適した場所は、 OnLaunched 内で、 if (e.PrelaunchActivated == false)
チェックが行われる場所の近くにあります。
アプリが事前起動されるかどうかは、システム リソースによって異なります。 システムでリソースの負荷が発生している場合、アプリは事前起動されません。
一部の種類のアプリでは、事前起動を適切に動作させるためにスタートアップ動作を変更する必要があります。 たとえば、起動時に音楽を再生するアプリなどです。ユーザーが存在することを前提とし、アプリの起動時に詳細なビジュアルを表示するゲーム。起動中にユーザーのオンライン表示を変更するメッセージング アプリ。これらのすべては、アプリが事前起動されたタイミングを識別でき、以下のセクションで説明するようにスタートアップ動作を変更できます。
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 イベント中にリストを更新できます。 次のコードは、MainPage の VisibilityChanged イベントを処理します。
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 と Windows 10 バージョン 1511 がある場合は、Visual Studio 2015 でアプリの事前起動をシミュレートするには、 Debug>その他のデバッグ ターゲット>Debug Windows ユニバーサル アプリの事前起動を選択します。