Возиться с общими настройками Android - какую функцию использовать?

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

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

4 ответа

Решение

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

Во-первых, давайте посмотрим на реализацию этих трех функций.

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

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

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

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

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

    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. Надеюсь, это поможет вам:)

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

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

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

Другие вопросы по тегам