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 и работает в асинхронном режиме, что является более предпочтительным вариантом.
как мне узнать сколько раз запускалось мое приложения
С помощью SharedPreferences можно создать сохраняемое значение — счетчик. Каждый раз при старте главного активити получать его, увеличивать на единицу и сохранять снова.
Подскажите в вашем примере у меня студия пишет что static Context может привести к утечке памяти. Правильно так делать?
Итересно получается в коде пишете
editor.commit();
а внизу жирными буквами ВНИМАНИЕ! Метод commit() устарел и объявлен deprecated
Это замечание добавлено в статью позже. «Устарел» и «deprecated» не значит «не работает». В Android SDK полно таких методов. См. комент выше.
будет . только apply работает только в версиях выше 9
изначально commit. возвращает true и false