Windows Phone 7用のアプリケーションを最初から最後まで作成します。 パート13.非アクティブ化後のアプリケーションの復元

前の部分

ユーザーがアプリケーションを離れると、非アクティブ化されます。 ユーザーが「戻る」ボタンを使用してアプリケーションに戻る場合、アプリケーションを適切な状態に復元する必要があります。

このパートでは、次のことを学習します。

トゥームストーンを確認する


原則として、アプリケーションはいつでも中断および非アクティブ化できます。これは、ユーザーが「開始」ボタンを使用して別のアプリケーションに切り替えると発生します。 これが発生した場合、アプリケーションはその状態を維持して、戻った場合に復元できるようにする必要があります。 ただし、分離ストレージは、状態データの短期ストレージには遅すぎます。 代わりに、状態を保存した辞書を使用してデータをキャッシュし、データをすばやく保存およびロードします。

アプリケーションが非アクティブ化されると、アプリケーションのレコードをメモリに保存し、キャッシュされたステータスデータに関連付けるトゥームストーン (tombstoneはトゥームストーン)と呼ばれる手順を使用してプロセスを停止できます。 ユーザーがアプリケーションに戻ると、オペレーティングシステムはアプリケーションプロセスを再起動し、ステータスデータをアプリケーションに戻します。

ヒント:
アプリケーションが中断されて再開された場合、ユーザーは中断された場所から作業を継続することを期待します。 このため、状態を変更できるページには常にトゥームストーンのサポートを実装する必要があります。 これは、ユーザー入力の更新と同じくらい複雑な状態の変更、またはリスト内の現在の選択の変更と同じくらい簡単な状態の変更に適用されます。 トゥームストーンのサポートがないと、最高の状態で使い勝手が悪くなり、最悪の場合は完全に予期しない動作になります。

認定要件:
アプリケーションは、ユーザーが電話をかけたり、着信に応答したり、電話を切ったりする能力を遅らせたり、妨げたりしてはなりません。

廃棄のサポートの実装


廃棄中に保持される一時キャッシュを使用するには、次の手順を実行します。
Stateのこれらの2つのプロパティは、値/キーペアを格納できる辞書です。ここで、値はプリミティブ型またはシリアル化可能なオブジェクトの値です。 非アクティブ化されたアプリケーションが再アクティブ化されるという保証はないため、これらの辞書を使用して、保存する必要のあるアプリケーションまたはユーザーデータを保存しないでください。 長期保管の場合は、分離ストレージを使用してください。

パフォーマンス改善のヒント:
状態辞書を使用して状態を復元します。 隔離されたストレージまたはインターネットからの回復は避けてください。

Fuel Trackerはトゥームストーン中にページレベルの一時的な状態を保存しますが、保存するアプリケーションレベルの状態データはありません。 各ページには、PhoneApplicationPage.Stateプロパティと共に状態データが保存されます。 たとえば、 FillupPageクラスには、一部のテキストフィールドにバインドされたFillupオブジェクトが含まれています。 このオブジェクトは、ユーザーが[保存]ボタンをクリックした場合にのみ、長期保存用に保存されます。 ただし、次のコードスニペットに示すように、トゥームストーン中、ページはオブジェクトをページのStateディクショナリに、ユーザーが変更したかどうかを示す値とともに配置します。 ([保存]ボタンの実装については、入力データの検証セクションで説明します。)
private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  1. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  2. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  3. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  4. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  5. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  6. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  7. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  8. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  9. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  10. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  11. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  12. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  13. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  14. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  15. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  16. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  17. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  18. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  19. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  20. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  21. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  22. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  23. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  24. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
  25. private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .
private const string CURRENT_FILLUP_KEY = "CurrentFillup" ; private const string HAS_UNSAVED_CHANGES_KEY = "HasUnsavedChanges" ; private Fillup currentFillup; private bool hasUnsavedChanges; protected override void OnNavigatedFrom(NavigationEventArgs e) { base .OnNavigatedFrom(e); if (cacheChanges) { CommitTextBoxes(); this .State[CURRENT_FILLUP_KEY] = currentFillup; this .State[HAS_UNSAVED_CHANGES_KEY] = hasUnsavedChanges; } } protected override void OnNavigatedTo(NavigationEventArgs e) { base .OnNavigatedTo(e); CarHeader.DataContext = CarDataStore.Car; DataContext = currentFillup = State.ContainsKey(CURRENT_FILLUP_KEY) ? (Fillup) this .State[CURRENT_FILLUP_KEY] : new Fillup() { Date = DateTime .Now }; hasUnsavedChanges = State.ContainsKey(HAS_UNSAVED_CHANGES_KEY) ? ( bool )State[HAS_UNSAVED_CHANGES_KEY] : false ; } * This source code was highlighted with Source Code Highlighter .

このコードでは、オーバーロードされたOnNavigatedFromメソッドは最初に、ステータスデータをキャッシュする必要があるかどうかを確認します。 FillupPageクラスはcacheChangesフィールドをtrueに初期化しますが 、通常のナビゲーションが発生するたびに(つまり、ユーザーが[保存]または[戻る]ボタンをクリックするたびに) falseに設定します。 したがって、非アクティブ化の結果としてナビゲーションが発生した場合にのみ、ページはデータをキャッシュします。

変更がキャッシュされた場合、OnNavigatedFromメソッドはテキストフィールドの値をバインドされたオブジェクト( currentFillupフィールドに格納)に適用し、 currentFillupおよびhasUnsavedChangesの値をStateディクショナリに格納します 。 通常、コントロールがフォーカスを失ったときにデータバインディングが発生するため、テキストフィールド値をコミットする必要があります。これは、アプリケーションが非アクティブ化されたときに自動的に発生しません。

OnNavigatedToメソッドは、 CarHeader要素をDataContextプロパティに設定し、保存された値をStateディクショナリから取得しようとします。 値がディクショナリに表示される場合、それらはcurrentFillupおよびhasUnsavedChangesフィールドに加えて、ページのDataContextプロパティを設定するために使用されます 。 それ以外の場合、デフォルト値が使用されます。

この実装は、基本的なトゥームストーンのサポートを提供しますが、ページ状態のすべての側面を保存するわけではありません。 特に、この実装は、フォーカスされているテキストフィールドを示す値を格納せず、フォーカスされているテキストフィールドのカーソル位置とハイライト状態も格納しません。 このステータス情報を維持することの重要性は、アプリケーションによって異なります。

ヒント:
廃棄サポートを実装するときは、徹底的にテストしてください。 これを行うには、各ページに移動し(エミュレーターまたは実際のデバイスを使用)、[スタート]ボタンをクリックしてから、[戻る]ボタンをクリックします。 アプリケーションのすべてのページですべての状態を確認し、再アクティブ化によって常に状態が復元されることを確認してください。

デバッグモードのVisual Studioのエミュレーターでトゥームストーンのサポートをテストすると、アプリケーションを非アクティブ化すると、デバッガーが切断されることがあります。 この場合、アプリケーションを再アクティブ化すると、「回復中」ページでアプリケーションがフリーズしたように見えます。 この問題を解決するには、単にVisual Studioに移動してF5をもう一度押します。 その後、アプリケーションが再起動され、再アクティブ化されます。

アプリケーションでアクションを実行するタイミング


アプリケーションライフサイクルの各フェーズのコードを記述できます。 データをロードし、廃棄をサポートするために、ページナビゲーションに応答する方法を上記で説明しました。 以下では、アプリケーションとページの一般的なライフサイクルについて説明し、ライフサイクルの各段階で記述できる一般的なタイプのコードを示します。

Windows Phoneアプリケーションは、ユーザーがアプリケーションのアイコンまたはタイルをクリックすると起動し、ユーザーがアプリケーションの最初のページで[戻る]ボタンをクリックすると閉じます。 外部イベント(たとえば、[開始]ボタンを押したとき)は、いつでもアプリケーションを非アクティブ化できます。これにより、アプリケーションが廃棄され、シャットダウンする可能性があります。 再アクティベーションは、アプリケーションを再起動し、以前の状態を復元する機会を与えます。 ライフサイクルのこれらの起動およびシャットダウンフェーズは、PhoneApplicationServiceクラスのLaunching、Activated、Closing、およびDeactivatedイベントとして表されます。

アプリケーションが起動するとすぐに、開始ページが自動的に開き、その後、ユーザーは追加のページに移動できます。 アプリケーションが非アクティブ化および再アクティブ化されると、以前アクティブだったページへの遷移が発生します。

アプリケーションが最初にページに移動するか、非アクティブ化および再アクティブ化後にページに戻ると、ページがインスタンス化され、コンストラクターが呼び出されます。次に、このページのオーバーロードされたOnNavigatedToメソッドが呼び出されます。 別のページに移動する、終了する、または非アクティブ化する少し前に、OnNavigatedFromメソッドが呼び出されます。 ユーザーが以前にアクセスしたページに戻り、このアクセス後にアプリケーションが非アクティブ化されていない場合にのみ、ページインスタンスが再利用されます。 この場合、アプリケーションは以前と同様にOnNavigatedToメソッドとOnNavigatedFromメソッドを呼び出しますが、その前にコンストラクターを呼び出すことはありません。

次の画像は、アプリケーションとページのライフサイクル全体を示しています。

画像

通常、Launching、Activated、Closing、Deactivatedイベントを使用して、アプリケーションの状態を初期化および維持します。 ただし、これらのイベントが発生した場合、電話機はまだアプリケーションのダウンロードまたはダウンロードの処理中であるため、大幅な遅延が発生する可能性があります。 これらの遅延の増加を回避するには、これらのイベントのハンドラーでの面倒な操作を常に回避する必要があります。

通常、ページのオーバーロードされたOnNavigatedToおよびOnNavigatedFromメソッドを使用して、ページの状態を初期化し、データのロードや保存などの時間のかかる操作を実行または実行します。 OnNavigatedToメソッドが呼び出されると、アプリケーションとページは既にロードを完了しており、使用可能です。 OnNavigatedFromメソッドが呼び出されたとき、アプリケーションとページはまだロードを開始していません。

認定要件:
アプリケーションは、起動後5秒以内に最初の画面を描画し、20秒以内にユーザーアクションに応答し始めます。

最初の要件を満たすために、スプラッシュ画面を表示できます。 2番目の要件を満たすために、必要な場合にのみデータをロードし、BackgroundWorkerを使用して、時間のかかる操作を非同期的に開始できます。 ただし、バックグラウンドスレッドを使用する場合でも、起動時間の増加を避けるため、LaunchingまたはActivatedイベントハンドラーではなく、オーバーロードされたOnNavigatedToメソッドで実行する必要があります。

認定要件:
また、アプリケーションがアンロードされると、閉じるまたは非アクティブ化するように要求されると、10秒以内にすべての操作を完了する必要があります。そうしないと、例外がスローされ、アプリケーションが中断されます。 この要件を満たすためには、データが利用可能になり次第すぐに保存するか、大量のデータがある場合は段階的に保存することを検討する必要があります。

次の部分

Source: https://habr.com/ru/post/J118459/


All Articles