弄乱 android 的共享首选项 - 使用哪个函数?

Mess with the shared preferences of android - which function to use?

这是一个标准任务:在应用程序的共享首选项中存储一些值,以便以后能够检索它。 但是你会发现里面有3个函数可以存储一个值:

//1.
public static SharedPreferences PreferenceManager.getDefaultSharedPreferences(Context context) {}

//2.
public SharedPreferences Activity.getPreferences(int mode) {}

//3.
public SharedPreferences ContextWrapper.getSharedPreferences(String name, int mode) {}

那么现在的问题是:选择哪一个,哪个更好,或者每个都有不同的目的?

这是我自己的问题的答案:

首先,让我们看一下这3个函数的实现。

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

//2.
public SharedPreferences Activity.getPreferences(int mode) {
    return getSharedPreferences(getLocalClassName(), mode);
}

//3.
public SharedPreferences ContextWrapper.getSharedPreferences(String name, int mode) {
    return mBase.getSharedPreferences(name, mode);
}

这里的 mBase 是对 Context 类型对象的引用。

我们看到第二个函数调用了第三个函数,这三个函数基本上是等价的,只是参数不同。想想重载。

接下来,深入到第一个函数的实现,我们可以简化其调用如下:

//1.
public static SharedPreferences PreferenceManager.getDefaultSharedPreferences(Context context) {
    return context.getSharedPreferences(context.getPackageName() +
        "_preferences", Context.MODE_PRIVATE);
}

同样,对于第二个函数:

//2.
public SharedPreferences Activity.getPreferences(int mode) {
    return mBase.getSharedPreferences(getLocalClassName(), mode);
}

总而言之,第一个函数创建了一个名为 <your_package_name>_preferences 的共享首选项文件,第二个函数创建了一个名为 <your_class_name> 的共享首选项文件,最后,第三个函数允许您为共享首选项文件指定任意名称。

不用说,您需要为共享首选项文件指定正确的名称才能检索保存的值。所以你可以使用第三个函数来自己指定名称,或者根据你之前的保存方式使用第一或第二个函数。

警告!确保您传递的是正确的上下文实例 class。 例如,一个混乱的场景看起来像这样:您正在从系统中 运行 的后台线程保存到共享首选项(例如,当使用 android 的 out-of-the -box SyncAdapter 框架)并尝试从您的 UI-thread 取回保存的值,您可能会得到 default/wrong 值!

希望这对其他人有所帮助...;)

它的唯一方法,只是不同的调用和可访问性

  1. "default" 表示您没有声明存储数据的 XML 文件的名称(这就是 SharedPreferences 的工作方式)并且每个 Activity 都可以使用它/Context(比方说 "globally")——如果你想保留几个值,你可以使用这个
  2. 保持值仅可用于调用 Acivity - "private" 用于存储 Activity,但请注意 int mode
  3. 最后一个也像第一个一样工作 "globally",但在这里 您可以声明文件名并保留几个不同种类的文件 values - 专用于创建更复杂的存储值结构(一些包装器等)

视情况而定。 #1 将 return SharedPreferences 用于您传递的任何上下文。 #2 将 return 您所在的 Activity 上下文的 SharedPreferences。这可能与 #1 相同,也可能不同。 #3 会让您将 SharedPreferences 分成不同的组并命名。这可能是一个很好的分手方式,但我从来没有真正做过。

我正在分享我的,希望它能让生活变得轻松 -

    public class SharedPreferenceStore {

    public static void deleteValue(Context context, String key) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        Editor editor = preferences.edit();
        editor.remove(key).apply();
    }

    public static void storeValue(Context context, String key, String value) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        Editor editor = preferences.edit();
        editor.putString(key, value).apply();
    }

    public static void storeValue(Context context, String key, boolean value) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        Editor editor = preferences.edit();
        editor.putBoolean(key, value).apply();
    }

    public static void storeValue(Context context, String key, double value) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        String doubleVal = String.valueOf(value);
        Editor editor = preferences.edit();
        editor.putString(key, doubleVal).apply();
    }

    public static void storeValue(Context context, String key, float value) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        Editor editor = preferences.edit();
        editor.putFloat(key, value).apply();
    }

    public static void storeValue(Context context, String key, long value) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        Editor editor = preferences.edit();
        editor.putLong(key, value).apply();
    }

    public static void storeValue(Context context, String key, int value) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        Editor editor = preferences.edit();
        editor.putInt(key, value).apply();
    }

    /*************************
     * GET Methods
     ***************************************/
    public static String getValue(Context context, String key, String defValue) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getString(key, defValue);
    }

    public static boolean getValue(Context context, String key, boolean defValue) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getBoolean(key, defValue);
    }

    public static double getValue(Context context, String key, double defValue) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        String doubleVal = String.valueOf(defValue);
        return Double.parseDouble(preferences.getString(key, doubleVal));
    }

    public static float getValue(Context context, String key, float defValue) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getFloat(key, defValue);
    }

    public static long getValue(Context context, String key, long defValue) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getLong(key, defValue);
    }

    public static int getValue(Context context, String key, int defValue) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getInt(key, defValue);
    }
}

只需使用 class 并忘记 SharedPrefences 的所有并发症。希望对你有帮助:)