Windows Phone 7のtombstone または tombstoningについて
tombstoneというのはアプリケーションやページの状態を保つための仕組みのことで、簡単に言うとページが遷移して戻ってきたときに元の状態に戻すことです。
ページが遷移した後に戻ってきたら入力したデータがなくなっていたら嫌ですよね?別のアプリケーションから戻ってきたら入力していたデータがなくなっていたら嫌ですよね?
そのような問題を解決するためにtombstoneはあります。
状態を保つといっても主に状態は二つに分かれます。アプリケーションの状態と各ページごとの状態です。
アプリケーションの状態はPhoneApplicationServiceのイベントによって管理されます。
App.xamlにこう記述されています。
<Application.ApplicationLifetimeObjects> <!--Required object that handles lifetime events for the application--> <shell:PhoneApplicationService Launching="Application_Launching" Closing="Application_Closing" Activated="Application_Activated" Deactivated="Application_Deactivated"/> </Application.ApplicationLifetimeObjects>
ここで、PhoneApplicationServiceの各イベント(Launching, Closing, Activated, Deactivated)にそれぞれのメソッドが割り当てられます。
イベント | メソッド |
---|---|
Launching | Application_Launching |
Closing | Application_Closing |
Activated | Application_Activated |
Deactivated | Application_Deactivated |
各イベントは次のとおりです。
Launching
アプリケーションが起動すると呼ばれます。
ここでは前の状態を復元するのではなく、新たにアプリケーションを開始するために必要となるデータを読み込みます。保存しておいたデータをあらかじめ読み込んだりします。
Closing
ハードウェアのバックボタンを押したときにアプリケーションの最初のページを通り過ぎたときにこのイベントが発生しアプリケーションが終了します。
一時的なデータを保存するのではなく、アプリケーションに必要なデータを保存するようにします。
Deactivated
LuncherやChooserを起動したり、Startボタンを押したときにこのイベントが発生します。
アプリケーションが終了するわけではないので、ここでは一時的なデータをPhoneApplicationServiceのStateに保存する必要があります。
しかし再び戻ってくる(Reactivate)とは限らないので、Isolated Storageに永続的なデータを保存する必要があるかもしれません。
ただしこのイベントは10秒以内で処理しなければならないので、大量のデータを保存するならアプリケーションを実行しているときに段階的に保存したほうがよいでしょう。
Activated
Backボタンを押して戻ってきたり、LuncherやChooserから戻ってくるときにこのイベントが発生します。
ここではDeactivatedされたときの状態に戻すために、一時的なデータを保存しているPhoneApplicationServiceからStateを読み込んだり、Isolated Storageから永続的なデータを読み込んだりします。
Launchingは永続的なデータの読み込み、Closingは永続的なデータの保存、Activatedはアプリケーションの状態の復元、Deactivatedはアプリケーションの状態の保存、といったところでしょうか。
各イベントの具体的な流れは下記のようになります。
また、各ページの状態を保存したいときはOnNavigatedToとOnNavigatedFromをオーバーライドして実装します。
OnNavigatedFromはページから出るときなので、PhoneApplicationPageのStateにデータを保存し、OnNavigatedToはページへ入ってくるときなので、PhoneApplicationPageのStateからデータを読み出してコントロールなどにデータをセットします。
これらの情報はWindows Phone 7 Training KitのApplicationLifetimeを参考にしています。詳しくはそちらを参照してください。