SharedPreferences. Сохранение данных в постоянное хранилище Android
SharedPreferences – постоянное хранилище на платформе Android, используемое приложениями для хранения своих настроек, например. Это хранилище является относительно постоянным, пользователь может зайти в настройки приложения и очистить данные приложения, тем самым очистив все данные в хранилище.
Для работы с данными постоянного хранилища нам понадобится экземпляр класса SharedPreferences, который можно получить у любого объекта, унаследованного от класса android.content.Context (например, Activity или Service). У объектов этих классов (унаследованных от Context) есть метод getSharedPreferences, который принимает 2 параметра:
- name – выбранный файл настроек. Если файл настроек с таким именем не существует, он будет создан при вызове метода edit() и фиксировании изменений с помощью метода commit().
- mode – режим работы. Возможные значения:
- MODE_PRIVATE – используется в большинстве случаев для приватного доступа к данным приложением-владельцем
- MODE_WORLD_READABLE – только для чтения
- MODE_WORLD_WRITEABLE – только записи
- MODE_MULTI_PROCESS – несколько процессов совместно используют один файл SharedPreferences.
ВНИМАНИЕ! Все модификаторы кроме MODE_PRIVATE в настоящий момент объявлены deprecated и не рекомендуются к использованию в целях безопасности. Если необходимо реализовать использование общих данных несколькими приложениями, это можно сделать через сервисы или контент-провайдеры. Подробнее можно почитать, например, здесь.
Чтобы получить значение необходимой переменной, используйте следующие методы объекта SharedPreferences:
- getBoolean(String key, boolean defValue),
- getFloat(String key, float defValue),
- getInt(String key, int defValue),
- getLong(String key, long defValue),
- getString(String key, String defValue),
- getStringSet(String key, Set defValues).
Второй параметр – значение, которое вернется в случае если значение по ключу key отсутствует в SharedPreferences. Также, методом getAll() можно получить все доступные значения.
Чтобы записать значение переменной необходимо:
- получить объект SharedPreferences.Editor выполнив метод edit() объекта класса SharedPreferences
- записать значение с помощью методов:
- putBoolean(String key, boolean value),
- putFloat(String key, float value),
- putInt(String key, int value),
- putLong(String key, long value),
- putString(String key, String value),
- putStringSet(String key, Set values)
- выполнить метод commit()
Также есть возможность удалить конкретное значение (remove(String key)) или все значения (clear())
Приведенный ниже код демонстрирует запись переменной типа String в хранилище:
SharedPreferences settings = context.getSharedPreferences(PERSISTANT_STORAGE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putString( "name", "John" ); editor.commit();
– context – объект, унаследованный от android.content.Context.
Представим простой класс для работы с постоянным хранилищем – PersistantStorage.
Перед записью значений в хранилище или получением значений из хранилища, класс нужно проинициализировать, вызвав метод init() и передав ему объект, унаследованный от android.content.Context (например, Activity или Service).
import android.content.Context; import android.content.SharedPreferences; public class PersistantStorage < public static final String STORAGE_NAME = "StorageName"; private static SharedPreferences settings = null; private static SharedPreferences.Editor editor = null; private static Context context = null; public static void init( Context cntxt )< context = cntxt; >private static void init() < settings = context.getSharedPreferences(STORAGE_NAME, Context.MODE_PRIVATE); editor = settings.edit(); >public static void addProperty( String name, String value ) < if( settings == null )< init(); >editor.putString( name, value ); editor.commit(); > public static String getProperty( String name ) < if( settings == null )< init(); >return settings.getString( name, null ); > >
В этом классе реализована работа только со строковыми данными. Вы легко можете самостоятельно его расширить, используя стандартные методы PersistantStorage или написав собственные сериализаторы для сложных объектов.
ВНИМАНИЕ! Метод commit() устарел и объявлен deprecated. Вместо него следует использовать метод apply() – он появился в API 9 и работает в асинхронном режиме, что является более предпочтительным вариантом.
Android studio shared preference как забрать значения
Нередко приложению требуется сохранять небольшие кусочки данных для дальнейшего использования, например, данные о пользователе, настройки конфигурации и т.д. Для этого в Android существует концепция Preferences или настройки. Настройки представляют собой группу пар ключ-значение, которые используются приложением.
В качестве значений могут выступать данные следующих типов: Boolean, Float, Integer, Long, String, набор строк.
Настройки общими для всех activity в приложении, но также могут быть и настройки непосредственно для отдельных activity
Настройки хранятся в xml-файлах в незашифрованном виде в локальном хранилище. Они невидимы, поэтому для простого пользователя недоступны.
При работе с настройками следует учитывать следующие моменты. Так как они хранятся в незашифрованном виде, то не рекомендуется сохранять в них чувствительные данные типа пароля или номеров кредитных карт. Кроме того, они представляют данные, ассоцииованные с приложением, и через панель управления приложением в Настройках ОС пользователь может удалить эти данные.
Общие настройки
Для работы с разделяемыми настройками в классе Activity (точнее в его базовом классе Context) имеется метод getSharedPreferences() :
import android.content.SharedPreferences; //. SharedPreferences settings = getSharedPreferences("PreferencesName", MODE_PRIVATE);Первый параметр метода указывает на название настроек. В данном случае название — «PreferencesName». Если настроек с подобным названием нет, то они создаются при вызове данного метода. Второй параметр указывает на режим доступа. В данном случае режим описан константой MODE_PRIVATE
Класс android.content.SharedPreferences предоставляет ряд методов для управления настройками:
- contains(String key) : возвращает true, если в настройках сохранено значение с ключом key
- getAll() : возвращает все сохраненные в настройках значения
- getBoolean (String key, boolean defValue) : возвращает из настроек значение типа Boolean, которое имеет ключ key. Если элемента с таким ключом не окажется, то возвращается значение defValue, передаваемое вторым параметром
- getFloat(String key, float defValue) : возвращает значение типа float с ключом key. Если элемента с таким ключом не окажется, то возвращается значение defValue
- getInt(String key, int defValue) : возвращает значение типа int с ключом key
- getLong(String key, long defValue) : возвращает значение типа long с ключом key
- getString(String key, String defValue) : возвращает строковое значение с ключом key
- getStringSet(String key, Set defValues) : возвращает массив строк с ключом key
- edit() : возвращает объект SharedPreferences.Editor , который используется для редактирования настроек
Для управления настройками используется объект класса SharedPreferences.Editor , возвращаемый метод edit() . Он определяет следующие методы:
- clear() : удаляет все настройки
- remove(String key) : удаляет из настроек значение с ключом key
- putBoolean(String key, boolean value) : добавляет в настройки значение типа boolean с ключом key
- putFloat(String key, float value) : добавляет в настройки значение типа float с ключом key
- putInt(String key, int value) : добавляет в настройки значение int с ключом key
- putLong(String key, long value) : добавляет в настройки значение типа long с ключом key
- putString(String key, String value) : добавляет в настройки строку с ключом key
- putStringSet(String key, Set values) : добавляет в настройки строковый массив
- commit() : подтверждает все изменения в настройках
- apply() : также, как и метод commit(), подтверждает все изменения в настройках, однако измененный объект SharedPreferences вначале сохраняется во временной памяти, и лишь затем в результате асинхронной операции записывается на мобильное устройство
Рассмотрим пример сохранения и получения настроек в приложении. Определим в файле activity_main.xml следующий пользовательский интерфейс:
На экране будут две кнопки — для сохранения и для вывода ранее сохраненного значения, а также поле для ввода и текстовое поля ля вывода сохраненной настройки.
Определим методы обработчики кнопок в классе MainActivity :
package com.example.settingsapp; import androidx.appcompat.app.AppCompatActivity; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity < private static final String PREFS_FILE = "Account"; private static final String PREF_NAME = "Name"; SharedPreferences settings; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); settings = getSharedPreferences(PREFS_FILE, MODE_PRIVATE); >public void saveName(View view) < // получаем введенное имя EditText nameBox = findViewById(R.id.nameBox); String name = nameBox.getText().toString(); // сохраняем его в настройках SharedPreferences.Editor prefEditor = settings.edit(); prefEditor.putString(PREF_NAME, name); prefEditor.apply(); >public void getName(View view) < // получаем сохраненное имя TextView nameView = findViewById(R.id.nameView); String name = settings.getString(PREF_NAME,"не определено"); nameView.setText(name); >>
При отсутствии настроек при попытке их получить, приложение выведет значение по умолчанию:

Теперь сохраним и выведем заново сохраненное значение:

Нередко возникает задача автоматически сохранять вводимые данные при выходе пользователя из activity. Для этого мы можем переопределить метод onPause:
package com.example.settingsapp; import androidx.appcompat.app.AppCompatActivity; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class MainActivity extends AppCompatActivity < private static final String PREFS_FILE = "Account"; private static final String PREF_NAME = "Name"; EditText nameBox; SharedPreferences settings; SharedPreferences.Editor prefEditor; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nameBox = findViewById(R.id.nameBox); settings = getSharedPreferences(PREFS_FILE, MODE_PRIVATE); // получаем настройки String name = settings.getString(PREF_NAME,""); nameBox.setText(name); >@Override protected void onPause() < super.onPause(); String name = nameBox.getText().toString(); // сохраняем в настройках prefEditor = settings.edit(); prefEditor.putString(PREF_NAME, name); prefEditor.apply(); >public void saveName(View view) < >public void getName(View view) < >>
Приватные настройки
Кроме общих настроек каждая activity может использовать приватные, к которым доступ из других activity будет невозможен. Для получения настроек уровня activity используется метод getPreferences(MODE_PRIVATE) :
import android.content.SharedPreferences; //. SharedPreferences settings = getPreferences(MODE_PRIVATE);
То есть в отличие от общих настроек здесь не используется название группы настроек в качестве первого параметра, как в методе getSharedPreferences() . Однако вся остальная работа по добавлению, получению и изменению настроек будет аналогична работает с общими настройками.
Android: использование SharedPreferences для сохранения настроек
Для большинства приложений требуется сохранить настройки, управляющие поведением программы. Android предоставляет несколько альтернативных способов сохранения данных приложения, каждый из которых оптимизирован для определенных нужд.
Общие настройки — простой и легкий механизм, основанный на парах «ключ — значение» и предназначенный для сохранения примитивных данных приложения, чаще всего пользовательских настроек.
- Введение
- Создание и сохранение настроек
- Получение общих настроек
- Очистка/удаление значения
- Preferences Framework
- PreferenceScreen
- settings.xml
- Определение параметров в string.xml и array.xml
- PreferenceActivity
- Отслеживание изменений в общих настройках
- This function is not relevant for a modern fragment-based PreferenceActivity
Введение
Класс SharedPreferences позволяет создавать в приложении именованные ассоциативные массивы типа «ключ — значение», которые могут быть использованы различными компонентами приложения (работая при этом в контексте одного и того же приложения).
Общие настройки поддерживают базовые типы boolean, string, float, long и integer, что делает их идеальным средством для быстрого сохранения значений по умолчанию, переменных экземпляра класса, текущего состояния UI и пользовательских настроек.
Создание и сохранение настроек
Чтобы создать или изменить Общие настройки, нужно вызвать метод getSharedPreferences в контексте приложения, передавая имя общих настроек, которые вы хотите изменить. Настройки недоступны для других приложений.
public static String MY_PREF = "MY_PREF"; protected void savePreferences() < // получить доступ к объекту Editor, чтобы изменить общие настройки. SharedPreferences.Editor editor = mySharedPreferences.edit(); // задать новые базовые типы в объекте общих настроек. editor.putBoolean("isTrue", true); editor.putFloat("floatNumber", 1f); editor.putInt("intNumber", 2); editor.putLong("longNumber", 3l); editor.putString("textValue", "Not Empty"); editor.commit(); >Получение общих настроек
Надо передать в getSharedPreferences имя тех общих настроек, доступ к которым хотите получить, и используйте типизированный метод get , чтобы извлечь сохраненные значения. Передаются ключ и значение по умолчанию (используется случае, если для данного ключа пока что не сохранено никакое значение).
public static String MY_PREF = «MY_PREF»; public void loadPreferences()
Очистка/удаление значения
Для очистки значений используйте методы SharedPreferences.Editor.remove(String key) и SharedPreferences.Editor.clear() .
Файл настроек хранится в /data/data/package_name/shared_prefs/имя_файла_настроек.xml. Можно удалить:
File file= new File("/data/data/. /shared_prefs/файл_настроек.xml") file.delete();Preferences Framework
В примерах выше происходило обычное сохранение и восстанавлениеи нужных параметров. То есть, создаётся свой xml-файл разметки и размещаются там нужные элементы управления. Но Android для этих целей предоставляет собственный Preferences Framework, с помощью которого можно создавать индивидуальный набор предпочтений и встраивать их в приложения.
То есть, теперь нет необходимости создавать файл разметки и get/set параметров писать самим. Необходимо лишь в отдельном файле перечислить параметры, а Android уже остальное сделает. Предпочтения — это отдельная активность в приложении, вызываемая из активности. Сам Activity расширяется от класса PreferenceActivity . Предпочтения определяются в отдельном XML-файле, где корневым элементом является элемент , который представляет собой контейнер для предпочтений и может содержать дочерние элементы . Элемент также является контейнерным элементом и предназначен для объединения предпочтений в группы.
PreferenceScreen
Необходимо первоначально создать в папке res/xml/ XML-файл ресурсов, как например, settings.xml. Выбирайте тип файла Android XML File:

При создании файла в диалоговом окне установите переключатель на Preference и убедитесь, что корневым элементом файла установлен PreferenceScreen:

settings.xml
Далее задаём необходимые настройки:
Мы определили две настройки: размер шрифта, язык приложения. С всё в целом понятно, простое поле. А вот для выбора языка посложнее элемент. Нас тут интересует 2 поля: android:entries и android:entryValues . Из названия, думаю, понятно их назначение.
Определение параметров в string.xml и array.xml
Естественно, необходимо определить все переменные. В string.xml:
Стиль Размер Настройки интерфейса Размер шрифта Устанавливает новый размер шрифта Введите размер шрифта (от 10 до 32) Язык приложения Устанавливает стиль для шрифта Выберите язык Настройки А так же в array.xml:
- Язык аппарата
- English
- Русский
- default
- en
- ru
PreferenceActivity
Для PreferenceActivity автоматически создаётся SettingsActivity . Нам в нём слегка необходимо изменить метод onCreate .
@Override public void onCreate(Bundle savedInstanceState)
Метод addPreferencesFromResource() считывает установленные настройки из XML-файла, где хранятся наши ресурсы, и делает их доступными для программы. В результате мы должны увидеть настройки на экране. Если автоматически наше Activity не было зарегестрировано, то добавим в манифесте AndroidManifest.xml:
Ну и напишем код, чтобы при клике на меню, открывалось наше окно с настройками. Для этого определим метод по созданию меню и onCreateOptionsMenu и метод, отслеживающий нажатия по меню onOptionsItemSelected :
public static final int IDM_PREF = 101; @Override public boolean onCreateOptionsMenu(Menu menu ) < menu.add(0, IDM_PREF, 0, "Настройки"); return super.onCreateOptionsMenu(menu); >@Override public boolean onOptionsItemSelected(MenuItem item) < Intent intent = new Intent(); switch (item.getItemId()) < case IDM_PREF: intent.setClass(this, SettingsActivity.class); startActivity(intent); break; >>

Теперь при вызове меню опций, нажимайте на пункт «Настройки» и откроется наше окно настроек.
Для сохранения предпочтений на выбор есть 4 класса:
- CheckBoxPreference
- EditTextPreference
- ListPreference
- RingtonePreference
Конкретно в данном примере используется EditTextPreference и ListPreference.
Так выглядит окно изменения для настроек:

Отслеживание изменений в общих настройках
Класс onSharedPreferenceChangeListener позволяет вызвать callback-метод в момент добавления, удаления или изменения конкретной Общей настройки. Используя этот обработчик, компоненты вашего приложения могут следить за изменениями в настройках, установленных пользователем, и обновлять пользовательский интерфейс или корректировать поведение программы.
This function is not relevant for a modern fragment-based PreferenceActivity
This function is not relevant for a modern fragment-based PreferenceActivity. Inflates the given XML resource and adds the preference hierarchy to the current preference hierarchy.
Такое сообщение вы увидите в SDK по поводу многих методов PreferenceActivity , у того же addPreferencesFromResource . Это означает, что методы устарели. В сущности, ничего фатального в этом нет, просто в более поздних версиях появились более удобные методы.
С версии 3.0 появились так называемые Fragments, с помощью которых можно работать с настройками.
Ещё раз повторю, если у вас старый вариант для работы с настройками используется, то он будет работать на всех устройствах нормально. Но если вы пишите для устройств с версией Android 3+, то лучше используйте фрагменты.
SharedPreferences в Android: сохраняем настройки

В этом уроке мы будем использовать SharedPreferences для хранения пользовательских данных в виде пар ключ-значение.
SharedPreferences в Android. Теория
SharedPreferences позволяют приложениям сохранять настройки в виде пар ключ-значение. Эти настройки сохраняются даже когда пользователь закрывает приложение.
Android хранит SharedPreferences в виде XML файла в папке shared_prefs по адресу data —> data —> [имя пакета] —> . Папку data можно получить с помощью вызова метода Environment.getDataDirectory() .
SharedPreferences зависят от приложения, то есть сохраненные данные будут удалены из Android устройства после удаления приложения или после очистки данных приложения.
Обзор API SharedPreferences
Android предоставляет три метода получения доступа к SharedPreferences:
- Метод getPreferences() используется внутри Activity для доступа к одному общему файлу настроек приложения.
- Метод getSharedPreferences() используется внутри Activity для доступа к разным файлам настроек приложения.
- Метод getDefaultSharedPreferences() используется классом PreferenceManager , чтобы получить доступ к стандартному файлу настроек.
В этом уроке мы познакомимся с методом getSharedPreferences() подробнее.
Этот метод используется следующим образом: