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秒以内にすべおの操䜜を完了する必芁がありたす。そうしないず、䟋倖がスロヌされ、アプリケヌションが䞭断されたす。 この芁件を満たすためには、デヌタが利甚可胜になり次第すぐに保存するか、倧量のデヌタがある堎合は段階的に保存するこずを怜蚎する必芁がありたす。



次の郚分



All Articles