Беспорядок с общими предпочтениями андроида - какую функцию использовать?

Здесь стандартная задача: сохранить некоторые значения в общих предпочтениях приложения, чтобы впоследствии получить их. Но вы обнаружите, что есть 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) {}

Итак, вот вопрос: какой выбрать и какой из них лучше или для каждого из них есть другая цель?

Ответ 1

Вот ответ на мой вопрос:

Сначала рассмотрим реализации этих трех функций.

//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.

Мы видим, что 2-я функция вызывает 3-й, и все эти 3 функции в основном эквивалентны, но с разными параметрами. Подумайте о перегрузке.

Затем, углубляясь в реализацию 1-й функции, мы можем упростить ее вызов следующим образом:

//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>, и, наконец, 3-я функция позволяет указать произвольное имя для файла общих предпочтений.

Излишне говорить, что вам нужно указать правильное имя для файла общих предпочтений, чтобы вернуть сохраненные значения. Таким образом, вы можете использовать третью функцию для указания имени самостоятельно или для использования 1-й или 2-й функции, соответствующей тому, как вы ее сохранили раньше.

Внимание! Убедитесь, что вы передаете правильный экземпляр класса Context. Например, беспорядочный сценарий будет выглядеть так: вы сохраняете в общих предпочтениях из фонового потока, который работает в системе (например, при использовании андроидной готовой рамки SyncAdapter) и пытается вернуться сохраненные значения из вашего UI-потока, вы можете получить значения по умолчанию/неправильные значения!

Надеюсь, это будет полезно для кого-то еще...;)

Ответ 2

Я делюсь своим, надеюсь, что это облегчит жизнь -

    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);
    }
}

Просто используйте класс и забудьте обо всех осложнениях SharedPrefences. Надеюсь, это вам поможет:)

Ответ 3

его единственный и единственный метод, только разные вызовы и доступность

  • "default" означает, что вы не объявляете имя файла XML, хранящего ваши данные (это то, как работает SharedPreferences), и он будет доступен из каждого Activity/Context (скажем, "глобально" ) если вы хотите сохранить несколько значений, вы можете использовать это
  • сохраняет значения, доступные только для вызова Acivity - "private" для хранения Activity, но знайте о int mode
  • последний работает также "глобально", как первый, но здесь вы можете объявить имя файла и сохранить несколько файлов с различными типами значения - предназначены для создания более сложных конструкций значений хранения (некоторые обертки и т.д.).

Ответ 4

Это зависит. # 1 Вернет SharedPreferences для любого контекста, который вы передадите. # 2 Вернет SharedPreferences для контекста Activity, в котором вы находитесь. Это может быть то же самое, что и # 1, или нет. # 3 Позволит вам разбить свои SharedPreferences на разные группы и назовите их. Это может быть хорошим способом разбить вещи, но я никогда не делал этого.