web-dev-qa-db-ja.com

SharedPreferencesアプリケーションコンテキストとアクティビティコンテキスト

アプリにデータを保存するために、いくつかのSharedPreferencesを使用しています。いくつかの設定は、多くのアクティビティで使用されています。

SharedPreferencesは、高速な読み取りアクセスのためにマップによって内部的に支援され、設定が変更されたときにsdcardに書き込まれることを知っています。

多くのアクティビティでsharedpreferenceにアクセスする場合、どちらの方法の方が良いのでしょうか。

  1. アクティビティコンテキストを使用して、すべてのアクティビティでインスタンス化します。
  2. すべてのアクティビティでインスタンス化しますが、アプリケーションコンテキストを使用します。
  3. 例えばアプリケーションクラスを1回だけインスタンス化します。これはシングルトンと同様です。

1.を使用する場合、ソリューションはすべてのアクティビティにsharedpreferenceオブジェクトがありますか?また、アクティビティが破棄されると、共有設定の内部マップは破棄されますか?

2.を使用する場合、すべてのアクティビティでgetSharedPreferencesを呼び出しますが、ソリューションは1つだけですか?また、アプリケーションが動作している限り、内部マップはメモリ内にありますか?

うまくいけば、誰かがAndroidが内部的にそれを処理する方法を知っています。

48
d1rk

Contextインスタンス(ActivityまたはApplicationインスタンス)が同じ静的マップHashMap<String, SharedPreferencesImpl>を共有することを示す sources を確認する価値があります。 。

したがって、Context.getSharedPreferences(name, mode)を介して同じ名前のSharedPreferencesのインスタンスを要求するたびに、キーのSharedPreferencesインスタンスが既にマップに含まれているかどうかを最初にチェックするため、同じインスタンスを取得します(渡された名前です)。 SharedPreferencesインスタンスがロードされると、再びロードされることはなく、代わりにマップから取得されます。

したがって、実際にはどちらの方法でもかまいません。重要なことは、アプリケーションの異なる部分から同じ設定を取得するために同じ名前を使用することです。ただし、環境設定用に単一の「アクセスポイント」を作成するとプラスになる場合があります。したがって、Application.onCreate()でインスタンス化された設定のシングルトンラッパーである可能性があります。

70
Vit Khudenko

SharedPreferencesは、Android=によってシングルトンとして内部的に管理されます。必要なだけインスタンスを取得できます。

context.getSharedPreferences(name, mode);

同じnameを使用している限り、常に同じinstanceを取得します。したがって、並行性の問題はありません。

18
David Wasser

プリファレンスにはsingletonクラスを使用し、アプリケーションコンテキストでプリファレンスを1回初期化します。データを追加、更新、削除するためのgetterおよびsetter(get/put)メソッドを作成します。

これにより、インスタンスが1回作成され、より読みやすく、再利用可能になります。

9
AAnkit