getDefaultSharedPreferencesとgetSharedPreferencesの違い


224

違いは何であるgetDefaultSharedPreferencesgetSharedPreferencesAndroidのでは?誰か説明していただけますか?


ほとんど明白な違いは、静的なものとそうでないものがあります。しかし、Contextどちらかを呼び出すにはインスタンスが必要なので、それは本当に問題ではありません。
LarsH

回答:


224

getDefaultSharedPreferences「com.example.something_preferences」のようなデフォルト名を使用します、名前getSharedPreferences必要です

getDefaultSharedPreferences実際にはContext.getSharedPreferences以下を使用します(以下はAndroidソースから直接):

public static SharedPreferences getDefaultSharedPreferences(Context context) {
    return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
        getDefaultSharedPreferencesMode());
}

private static String getDefaultSharedPreferencesName(Context context) {
    return context.getPackageName() + "_preferences";
}

private static int getDefaultSharedPreferencesMode() {
    return Context.MODE_PRIVATE;
}

9
getDefaultSharedPreferencesName名前はバックアップ/復元フレームワークに必要なので、悪いことは公開されていません。
マーティン


また、プリファレンスのカスタム名を使用するgetSharedPreferencesモードで、プリファレンスの変更をリッスンする方法を教えてください。(getSharedPreferences "com.example.something_preferences"などのデフォルト名は使用しないでください)
Dr.jacky

ソースへのリンクを追加していただけませんか?
Mr_and_Mrs_D 2013年

@Mr_and_Mrs_D調べるほうが簡単です。リンクを追加すると、特定のAPIバージョンへのリンクになるため、探しているものとは異なる場合があります。
copolii 2013

120

違いの基本的なポイントを見てみましょう:

  1. getDefaultSharedPreferences()デフォルトの設定ファイル名を使用します。このデフォルトはアプリケーションごとに設定されるため、次の例のように、同じアプリコンテキスト内のすべてのアクティビティが簡単にアクセスできます。

    SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this);
    if (spref.contains("email")) {
         String sEmailAddr = spref.getString("email", "");
    }

    設定は通常に保存され/data/data/com.package.name/shared_prefs/com.package.name_preferences.xmlます。

  2. 代替方法- getSharedPreferences(name,mode)特定の設定(ファイル)名と操作モード(プライベート、ワールド読み取り可能など)を示す必要があります。

copoliiで述べたように、結果は同じですが、最初のオプションはより単純であり、2番目のオプションで提供される複数の設定ファイルに分割する柔軟性に欠けていますgetSharedPreferences()。MODE_WORLD_READABLE操作インジケーターを使用してアプリ間で設定を共有することもgetSharedPreferences()、を使用して可能ですが、ほとんど使用されません。

IMHO getDefaultSharedPreferences()は、アプリ内の異なるモジュールが異なる設定ファイルを使用することを望まない限り、タイプミスや混乱が生じやすい複数の設定ファイル名の混乱に陥ることなく安全に使用できます。通常、これは必要ありません。アプリが多くのパラメーターを保存する必要がある場合は、データ保護も向上するため、おそらく外部データベースを使用する方が良いでしょう。

誰かがgetDefaultSharedPreferences()ではなくgetSharedPreferences()を定期的に使用する正当な理由を知っている場合は、ここにコメントしてお知らせください。


7
私の理由は次のとおりです。stackoverflow.com
questions / 10786172

1
また、プリファレンスのカスタム名を使用するgetSharedPreferencesモードで、プリファレンスの変更をリッスンする方法を教えてください。(getSharedPreferences "com.example.something_preferences"などのデフォルト名を使用しない)
Dr.jacky

Dr.jacky私はあなたがあなたの好みをある種のセッションのようなオブジェクトに包むだろうと言います:クラスセッション{prefs = getSharedPreferences()...}そして、あなたが監視したいもののためにゲッターとセッターを使います。セッターが呼び出されると、セッターロジックでイベントをトリガーできます。
Alex Weavers

2

私はこの投稿が少し古いことを知っていますが、v7サポートライブラリの24.0.1以降、次を使用してどこからでもコンテキストによってデフォルトの設定を取得できます

// context might be an application context, activity, ..
// so if you want to get your apps defaults, pass an activity context
PreferenceManager.getDefaultSharedPreferences(context)

https://developer.android.com/reference/android/support/v7/preference/PreferenceManager#getdefaultsharedpreferencesを参照してください


PreferenceManagerはAndroid Qで非推奨になっています。ただし、context.getSharedPreferencesの方法は引き続き使用できます。この呼び出しをcontext.getSharedPreferences( "$ {packageName} _preferences"、MODE_PRIVATE)に変更しました
Kevin

2
Androixに移動されたばかりなので、PreferenceManagerは廃止されているようです。developer.android.com/reference/androidx/preference/...
FutureShocked

1

3番目の関数もあります。

public SharedPreferences Activity.getPreferences(int mode) {}

私の質問と回答をここで参照してください:Androidの共有設定で混乱-どの機能を使用しますか?


これは、ActivityソースコードのgetSharedPreferences()のラッパーです。public SharedPreferences getPreferences(int mode){return getSharedPreferences(getLocalClassName()、mode); }
2016

1

getSharedPreferences()とgetDefaultSharedPreferences()の両方を使用して、アプリケーションレベルの設定にアクセスします。getDefaultSharedPreferences()を使用して、Androidの全体的な設定フレームワークに従って機能する共有設定を取得します。getDefaultSharedPreferences()は、デフォルトでPreferenceActivityと連携するSharedPreferencesオブジェクトを提供するため、使用するのが適切です。


0

デフォルトの共有設定を使用することは、パッケージ名で共有設定を使用することと同じではないことに注意してください。

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

=>共有設定の名前: " com.my.packagename "

PreferenceManager.getDefaultSharedPreferences(context);

=>共有設定の名前: " com.my.packagename_preferences "

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.