none
最小化後の画面の復元方法 RRS feed

  • 質問

  • C# xaml で画面構築しております。

    画面が複数ページにまたがる使用となっており

    top→1ページ目→2ページ目→3ページ目→4ページ目(条件により複数回3ページ目の入力を行う)→5ページ目

    という画面構成となっております。

    3ページ目移行で画面の最小化を行うと復帰した際にスプラッシュスクリーンからの初期起動に変わってしまいます。

    navigationHelper_SaveState、navigationHelper_LoadStateで各画面でのデータの保存は行ってますが

    最小化後の起動では ApplicationExecutionState.NotRunning の状態になっている為

    Terminatedの起動処理へ流れてはいきません。

    そもそもの問題として、最小化後の起動で初期起動になることがおかしいのかとも思いますが

    手探りの状態となりますが何か改善点や方法が御座いましたらご教授願います。

    2016年3月1日 8:45

回答

すべての返信

  • こんにちは。

    先にお聞きしたいのですが、Windowsストアアプリですか?UWPアプリですか?

    その上で、

    • ナビゲーションは現在どのように行っていますか?
    • 最小化から復帰までの時間はどの程度でしょうか、即時復帰しても発生しますか?
    • 2ページ目以前の場合は発生しないという意味で良いでしょうか?

    を教えてください。

    現在の復帰の手順も教えてください。デバイスはWindows10PCですか?Mobileですか?
    VisualStudioデバッグ操作上の「中断」/「再開」を指してますでしょうか。

    ===

    追加の情報が無い限り推測になってしまいますが、
    何らかの問題が発生してアプリケーションが終了してしまっている可能性もあります。

    アプリのライフサイクル

    アプリがクラッシュした後でユーザーがアプリをアクティブ化すると、アクティブ化イベント ハンドラーは ApplicationExecutionState の値として NotRunning を受け取り、アプリの最初の UI とデータを表示します。クラッシュの後、Suspended に基づく Resuming で使ったアプリ データはそのまま使わないでください。

    その辺りも問題が無いかどうか、見直してみてください。

    2016年3月1日 9:04
    モデレータ
  • お世話になります。

    Windowsストアアプリとなります。

    1ページ目と2ページ目ではそのような現象は起こりません。3ページ目以降で発生しております。

    復帰までの時間が約5秒たつと初回起動になってしまいます。デバイスはwindows8.1となります。


    2016年3月1日 10:17
  • お世話になっております。

    張って頂いたリンクの

    >ユーザーがアプリを別のアプリに切り替えると、元のアプリは表示されなくなりますが、Windows によって中断されるまでは Running 状態が維持されます。ユーザーがアプリを切り替えても、中断される前にそのアプリをアクティブ化したり再びそのアプリに切り替えた場合は、アプリは Running 状態のままになります。

    とありますが、windowsにより中断されたということになるのでしょうか?

    ソースからデバッグで実行した際にはこの現象がおこらず、

    デバッグ無しで開始の場合にこの現象がおこりどこを調査したらよいかの目途が立たない状態となっております。

    >VisualStudioデバッグ操作上の「中断」/「再開」を指してますでしょうか。

    →中断/再開のテストは行っていますが問題は起こりません。

    2016年3月1日 10:30
  • Windowsランタイムは5秒でタイムアウト扱いだった気がします。
    3ページ目以降の中断処理に5秒以上かかってしまっている可能性は無いでしょうか?
    そのため、予期せぬ終了となってしまっているとか。

    http://blogs.msdn.com/b/shozoa/archive/2012/11/14/about-grid-application-7-on-windows-store-application.aspx

    Windows ストアアプリでは、アプリがバックグラウンドに移行するとシステム側がシステムリソースとの関係で一時停止させたり、強制終了させたりする場合があります。この時の状態遷移は、「一時停止」-[復帰]、[一時停止]-[強制終了]の2種類となります。一時停止に伴い、Suspendイベントがアプリに通知されるため、Suspendイベントの処理は「5秒以内に完了」する必要があります。仮に、5秒を超えるとシステムがアプリを強制終了させます。

    3ページ目の中断処理を試しになくしてみたらどうなりますかね。


    2016年3月1日 10:48
    モデレータ
  • お世話になっております。

    ご教授頂いた通り5秒でエラーになっていることが分かりました。

    App.xaml.csのOnSuspendingの

    await SuspensionManager.SaveAsync();

    内でエラーが起きている事が分かりました。

    エラーメッセージですが

    GetNavigationState doesn't support serialization of a parameter type which was passed to Frame.Navigate. 

       at Windows.UI.Xaml.Controls.Frame.GetNavigationState() 
       at Test.Common.SuspensionManager.SaveFrameNavigationState(Frame frame) 
       at Test.Common.SuspensionManager.<SaveAsync>d__0.MoveNext() 03/03/2016 07:42:07.999 

    と出ております。

    何か改善点でご教授願います。

    2016年3月3日 10:46
  • 保存時のページシリアライズに失敗しているようです。

    https://msdn.microsoft.com/ja-jp/library/windows/apps/hh702394.aspx?f=255&MSPPError=-2147217396

    GetNavigationState を使用してフレームの状態のシリアル化を有効にするには、文字列、文字、数字、GUID 型など、ナビゲーション パラメーターの基本型のみを使用する必要があります。それ以外の場合には、GetNavigationState は、アプリケーションが中断された場合、例外をスローします。

    3ページ目が上記に該当するのではないでしょうか。
    見直してみてください。


    2016年3月3日 10:56
    モデレータ
  • お世話になっております。

    まさしくご教授頂いた

    >文字列、文字、数字、GUID 型など、ナビゲーション パラメーターの基本型のみを使用する必要があります。それ以外の場合には、GetNavigationState は、アプリケーションが中断された場合、例外をスローします。

    この内容でした。

    勉強不足の為、この内容を知らずに作成していましてこれから変更するのに苦悩しそうです。

    有難うございました。

    2016年3月5日 11:11