スコアを保存できるようにする

スコアはカウントできるようになりましたが、メモリ上にしか存在せず、ファイルに保存していないのでアプリを終了するとスコアは消えてしまいます。

スコアを保存できるようにしましょう。

Windowsストアアプリでは設定データの保存はApplicationDataContainerというクラスで実現できます。
しかし、どのタイミングでデータを保存すべきなのでしょうか。

Windowsストアアプリは基本的には終了という概念はなく、別のアプリに切り替えてバックグラウンドに回ったあと、しばらくしてメモリが足りなくなったらシステムがアプリを中断または終了します。
この中断のタイミングでデータをメモリからファイルに保存すべきです。

App.xaml.csの中にOnSuspendingというメソッドがあります。

private void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();
    //TODO: アプリケーションの状態を保存してバックグラウンドの動作があれば停止します
    deferral.Complete();
}

このメソッドがサスペンド(中断時)に実行されるメソッドです。
このメソッドにデータを保存する処理を加えましょう。

private void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();
    //TODO: アプリケーションの状態を保存してバックグラウンドの動作があれば停止します

    //追加
    ApplicationDataContainer container= ApplicationData.Current.LocalSettings;
    container.Values["score"] = Score.Counter;

    deferral.Complete();
}

ApplicationData.Current.LocalSettingsでローカルの設定コンテナーを取得できます。
そのValueディクショナリに「score」というキーで現在のスコアを保存します。

これでスコアの保存は出来ました。
次に起動時にスコアの復元処理をおこないます。

再びApp.xaml.csのOnLaunchedメソッド内のif(rootFrame==null)以下を編集します。

if (rootFrame.Content == null)
{
    // ナビゲーションの履歴スタックが復元されていない場合、最初のページに移動します。
    // このとき、必要な情報をナビゲーション パラメーターとして渡して、新しいページを
    // 作成します

    Score.Counter = 0;

    //追加
    ApplicationDataContainer container = ApplicationData.Current.LocalSettings;
    if (container.Values.ContainsKey("score"))
    {
        Score.Counter = int.Parse(container.Values["score"].ToString());
    }

    rootFrame.Navigate(typeof(StartPage), e.Arguments);
}

ContainsKeyメソッドですでに保存されているか、初回起動かどうかを判定できます。

これでアプリケーションが終了してもデータが復元できました。

※Alt+F4やアプリを上から下にドラッグアンドドロップではサスペンド状態にはならず、データは保存されません。
サスペンドを強制的に起こすにはVisualStudioのメニューバーから[表示]→[ツールバー]→[デバッグの場所]を押して、中断ボタンを押します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください