web-dev-qa-db-ja.com

getDefaultSharedPreferencesとgetSharedPreferencesの違い

AndroidのgetDefaultSharedPreferencesgetSharedPreferencesの違いは何ですか?誰でも説明できますか?

216
James

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;
}
222
copolii

基本的な違いを見てみましょう。

  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)は、特定の設定(ファイル)名と操作モード(プライベート、world_readableなど)を示す必要があります

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

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

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

118
wiztrail

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

// 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 を参照してください

2
Makibo

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

public SharedPreferences Activity.getPreferences(int mode) {}

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

1
Hack06

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

1

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

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

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

PreferenceManager.getDefaultSharedPreferences(context);

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

0
Richard R