UWPアプリを再起動する
- アプリから自分自身を再起動できます
- 再起動時に文字列をパラメーターとして渡せます
- Windows 10 version 1709(build 16299)から利用可能
CoreApplicationクラス(Windows.ApplicationModel.Core名前空間)のRequestRestartAsync静的メソッドを使うと、自分自身の再起動を要求できます。ただし、要求が受け付けられるのは、自分自身がフォアグラウンドで動いているときだけです。再起動をまたいで文字列の受け渡しができます。
再起動を要求する
再起動を要求するには、CoreApplicationクラスのRequestRestartAsync静的メソッドを呼び出すだけです(次のコード)。引数には、再起動をまたいで引き渡したい文字列を指定します。
string param = "{再起動をまたいで引き渡したい文字列}"; AppRestartFailureReason result = await CoreApplication.RequestRestartAsync(param);
RequestRestartAsync静的メソッドが返すAppRestartFailureReason列挙体の意味は、次のようになっています。
| 値 | 再起動 | 意味 |
|---|---|---|
| RestartPending(0) | 成功 | 再起動が進行中です |
| NotInForeground(1) | 失敗 | アプリがフォアグラウンドになっていません |
| InvalidUser(2) | 失敗 |
指定されたユーザーでは再起動できません ※RequestRestartForUserAsync静的メソッドを使った場合に出る可能性があります |
| Other(3) | 失敗 | 想定外の理由で失敗しました |
再起動が成功するには、RequestRestartAsync静的メソッドを呼び出したときにアプリがフォアグラウンドでアクティブになっている必要があります。サンプルコードでは、再起動を要求するボタンがクリックされてからRequestRestartAsync静的メソッドを呼び出すまでに3秒の遅延を入れてありますので、その間に最小化したり、他のアプリをアクティブにしたりして確かめてみてください。次の画像は、ボタンクリック直後に他のアプリをアクティブにした場合の例です。
再起動されたときにパラメーターを受け取る
再起動されたときと通常起動とで、とくに違いはありません。そのため、再起動のとき以外にも起動時にパラメーターを受け取るアプリでは、パラメーター文字列に目印を付けておいて再起動かどうかを判定するようにします。
通常起動と同じですから、アプリの初期化にはOnLaunchedメソッド(Appクラス)が呼び出されます。OnLaunchedメソッドの引数にパラメーター文字列が入っています。また、再起動されたときは前回のアプリ終了が正常に行われたはずですから、引数のPreviousExecutionStateプロパティはApplicationExecutionState.Terminatedになっているはずです。
再起動されたときにパラメーターを受け取るコードの例を次に示します。
// 再起動時のパラメーターには、目印としてこの文字列を先頭に付ける
public const string RestartParamHeader = "$RestartParam$";
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
string argument = e.Arguments as string; // パラメーター文字列
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame == null)
{
rootFrame = new Frame();
// 前回、正常に終了していて……
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
// パラメーターが空ではなく、RestartParamHeaderで始まっているなら……
if (!string.IsNullOrEmpty(argument) && argument.StartsWith(RestartParamHeader))
{
// ……それは、再起動されたときである(と、みなす)。
// ここで再起動されたときの処理を行う
// 再起動をまたいで受け取ったパラメーター文字列を取り出す例
argument = argument.Replace(RestartParamHeader, string.Empty);
}
}
Window.Current.Content = rootFrame;
}
if (rootFrame.Content == null)
{
rootFrame.Navigate(typeof(MainPage), argument);
}
Window.Current.Activate();
}
