今回はアプリケーションの設定を保存する方法の説明です。

サンプル: https://github.com/stack3/AndroidPreferenceSamples

サンプルをダウンロードして起動し、Programaticを選択すると以下の様な画面が表示されます。

01

Saveボタンを押すとSaved Countの値が+1され、Saved atに保存した時の日時が表示されます。

02

アプリを終了させて再起動させても以前の値は保持されています。これはSharedPreferencesを使って保存しているからです。

SharedPreferencesクラス

まずはSharedPreferencesクラスについて説明します。
通常、SharedPreferencesオブジェクトを得るには、PreferenceManager.getDefaultSharedPreferencesを使います。

// thisはActivity
PreferenceManager.getDefaultSharedPreferences(this);

他にActivity#getSharedPreferencesで得る方法もあります。

SharedPreferences pref = getSharedPreferences(PREF_NAME, Activity.MODE_PRIVATE);

通常は、PreferenceManager.getDefaultSharedPreferencesで良いと思います。また次回説明する設定画面を作るときもDefaultSharedPreferencesと連動するので、DefaultSharedPreferencesだけ使ったほうが便利だと思います。

データの保存先

SharedPreferencesを経由して保存したデータはXMLファイルで保存されます。保存先フォルダはdata/data/アプリのパッケージ名/shared_prefs/です。

PreferenceManager.getDefaultSharedPreferencesを使った場合、「アプリのパッケージ名_preferences.xml」というファイル名で保存されます。

Activity#getSharedPreferencesを使った場合、「引数に指定したname.xml」をファイル名として保存されます。

Activity#getSharedPreferencesの引数

第1引数 name: 任意の名前。通常設定のカテゴリ名などになると思います。
例)”user” / “account” / “config”
本サンプルでは以下のように定数定義しています。

private static final String PREF_NAME = "preference-sample";

第2引数 mode: 以下の定数を指定します。

  • Activity.MODE_PRIVATE: アプリケーション内でのみ読み書き可能なデータ。通常はこれを使います。
  • 以下はAPI 17でセキュリティ面からdeprecatedになったので使わない方が良いです。
    • Activity.MODE_WORLD_READABLE: 他のアプリケーションからも読みだし可能なデータ。
    • Activity.MODE_WORLD_WRITABLE: 他のアプリケーションからも書き込み可能なデータ。

SharedPreferencesによる読み出し

SharedPreferencesから設定内容を以下のメソッドで読み出すことができます。

  • getBoolean(key, defValue)
  • getFloat(key, defValue)
  • getInt(key, defValue)
  • getLong(key, defValue)
  • getString(key, defValue)

keyに設定項目名を指定し、defValueにデフォルト値を指定します。項目が未保存だった場合はデフォルト値が返ります。
例)

// 項目ageが未保存だった時は20が返される
int age = pref.getInt("age", 20);

本サンプルではloadPreferencesというメソッドで設定の読み出しを以下のように実装しています。

// 項目名を定数で定義
private static final String PREF_KEY_SAVED_COUNT = "savedCount";
private static final String PREF_KEY_SAVED_AT = "savedAt";

private void loadPreferences() {
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
    // savedCountを読み出し。デフォルト値は0
    savedCount = pref.getLong(PREF_KEY_SAVED_COUNT, 0);
    // savedAtをlong型で読み出し。デフォルト値は0
    long savedAtInterval = pref.getLong(PREF_KEY_SAVED_AT, 0);
    if (savedAtInterval == 0) {
        // 0つまり、未保存ならnullとする
        savedAt = null;
    } else {
        // Date型に変換
        savedAt = new Date(savedAtInterval);
    }
}

SharedPreferences.Editorでの書き込み

SharedPreferencesには書き込みのメソッドはありません。SharedPreferences.Editorクラスを使います。このクラスのオブジェクトはSharedPreferenceから得られます。

SharedPreferences.Editor editor = prefEditor = pref.edit();

SharedPreferences.Editorには以下のメソッドが用意されています。

  • putBoolean(key, value)
  • putFloat(key, value)
  • putInt(key, value)
  • putLong(key, value)
  • putString(key, value)

putメソッドで各項目の値を設定したらcommitメソッドで保存します。

本サンプルでは設定への書き込みはsavePreferencesというメソッドで以下のように実装しています。

private void savePreferences() {
    // 現在の時刻を得る
    savedAt = new Date();
    // 保存回数を+1
    savedCount++;

    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor prefEditor = pref.edit();
    // savedCountを保存
    prefEditor.putLong(PREF_KEY_SAVED_COUNT, savedCount);
    // savedAt(Date)はそのままでは保存できないので、getTimeで返されるlong値を保存
    prefEditor.putLong(PREF_KEY_SAVED_AT, savedAt.getTime());
    // 最後commit
    prefEditor.commit();
}

その2へ続く