SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

UWPアプリ開発の最前線

UWPアプリの自動起動/再起動/事前起動/コマンドラインから起動/終了キャンセル
~コードからアプリの起動と終了を制御する

UWPアプリ開発の最前線 第12回


  • X ポスト
  • このエントリーをはてなブックマークに追加

UWPアプリを再起動する

再起動したサンプルアプリ
再起動直後のサンプルアプリ
  • アプリから自分自身を再起動できます
  • 再起動時に文字列をパラメーターとして渡せます
  • Windows 10 version 1709(build 16299)から利用可能

 CoreApplicationクラス(Windows.ApplicationModel.Core名前空間)のRequestRestartAsync静的メソッドを使うと、自分自身の再起動を要求できます。ただし、要求が受け付けられるのは、自分自身がフォアグラウンドで動いているときだけです。再起動をまたいで文字列の受け渡しができます。

再起動を要求する

 再起動を要求するには、CoreApplicationクラスのRequestRestartAsync静的メソッドを呼び出すだけです(次のコード)。引数には、再起動をまたいで引き渡したい文字列を指定します。

再起動を要求する(MainPage.xaml.Restart.cs
string param = "{再起動をまたいで引き渡したい文字列}";
AppRestartFailureReason result = await CoreApplication.RequestRestartAsync(param);

 RequestRestartAsync静的メソッドが返すAppRestartFailureReason列挙体の意味は、次のようになっています。

AppRestartFailureReason列挙体
再起動 意味
RestartPending(0) 成功 再起動が進行中です
NotInForeground(1) 失敗 アプリがフォアグラウンドになっていません
InvalidUser(2) 失敗 指定されたユーザーでは再起動できません
※RequestRestartForUserAsync静的メソッドを使った場合に出る可能性があります
Other(3) 失敗 想定外の理由で失敗しました

 再起動が成功するには、RequestRestartAsync静的メソッドを呼び出したときにアプリがフォアグラウンドでアクティブになっている必要があります。サンプルコードでは、再起動を要求するボタンがクリックされてからRequestRestartAsync静的メソッドを呼び出すまでに3秒の遅延を入れてありますので、その間に最小化したり、他のアプリをアクティブにしたりして確かめてみてください。次の画像は、ボタンクリック直後に他のアプリをアクティブにした場合の例です。

再起動に失敗したサンプルアプリ
再起動に失敗したサンプルアプリ

再起動されたときにパラメーターを受け取る

 再起動されたときと通常起動とで、とくに違いはありません。そのため、再起動のとき以外にも起動時にパラメーターを受け取るアプリでは、パラメーター文字列に目印を付けておいて再起動かどうかを判定するようにします。

 通常起動と同じですから、アプリの初期化にはOnLaunchedメソッド(Appクラス)が呼び出されます。OnLaunchedメソッドの引数にパラメーター文字列が入っています。また、再起動されたときは前回のアプリ終了が正常に行われたはずですから、引数のPreviousExecutionStateプロパティはApplicationExecutionState.Terminatedになっているはずです。

 再起動されたときにパラメーターを受け取るコードの例を次に示します。

再起動されたときにパラメーターを受け取る(App.xaml.cs
// 再起動時のパラメーターには、目印としてこの文字列を先頭に付ける
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();
}

次のページ
UWPアプリを事前起動する

関連リンク

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
UWPアプリ開発の最前線連載記事一覧

もっと読む

この記事の著者

biac(ばいあっく)

HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11325 2019/07/22 18:45

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング